코틀린 코딩테스트 강좌, 카드 정렬하기

안녕하세요! 이번 코틀린 코딩테스트 강좌에서는 “카드 정렬하기”라는 흥미로운 문제를 다루겠습니다. 알고리즘 문제를 해결하는 과정에서 중요한 논리적 사고와 다양한 자료 구조에 대한 이해도를 높일 수 있는 기회가 될 것입니다.

문제 설명

문제는 주어진 카드들을 정렬하는 것입니다. 각 카드는 다음과 같은 정보로 구성되어 있습니다:

  • 값: 카드의 수치 (예: 1, 2, 3)
  • 색: 카드의 색깔 (예: 클럽, 다이아몬드, 하트, 스페이드)

주어진 카드들을 크기와 색깔에 따라 정렬하는 프로그램을 작성하세요. 카드의 크기는 숫자를 기준으로 오름차순으로 정렬하며, 숫자가 같을 경우 색깔에 따라 정렬합니다. 색깔은 클럽 < 다이아몬드 < 하트 < 스페이드의 순서로 정렬합니다.

입력 형식

입력은 여러 장의 카드로 구성된 배열로 주어집니다. 각 카드는 배열의 원소로서 Pair(value, color) 형식을 가집니다. 예를 들어, [Pair(3, '하트'), Pair(2, '스페이드'), Pair(3, '다이아몬드'), Pair(1, '클럽'), Pair(2, '하트')]와 같은 형태입니다.

출력 형식

출력은 정렬된 카드 배열입니다. 카드의 정보는 Pair(value, color) 형식으로 표현되어야 합니다.

문제 풀이 과정

1. 문제 이해하기

문제의 핵심은 카드들을 정렬하는 것입니다. 정렬을 수행하기 위해 두 가지 기준이 필요합니다:

  • 값(value): 카드의 수치
  • 색(color): 카드의 종류로서 정의된 순서에 따라 처리

2. 데이터를 어떻게 정렬할 것인가?

정렬 기준을 정의하기 위해, 색깔에 대한 우선순위를 숫자로 매핑하는 작업이 필요합니다. 예를 들어, 다음과 같이 매핑할 수 있습니다:

  • 클럽: 1
  • 다이아몬드: 2
  • 하트: 3
  • 스페이드: 4

이를 통해 색깔에 대한 정렬 조건을 쉽게 만들 수 있습니다.

3. 코틀린으로 구현하기

이제 위의 설명을 바탕으로 코드를 작성해보겠습니다. 아래는 코틀린을 사용한 카드 정렬 프로그램의 구현 예시입니다:

data class Card(val value: Int, val color: String)

fun main() {
    val colors = mapOf(
        "클럽" to 1,
        "다이아몬드" to 2,
        "하트" to 3,
        "스페이드" to 4
    )
    
    val cards = listOf(
        Card(3, "하트"),
        Card(2, "스페이드"),
        Card(3, "다이아몬드"),
        Card(1, "클럽"),
        Card(2, "하트")
    )
    
    val sortedCards = cards.sortedWith(compareBy({ it.value }, { colors[it.color] }))
    
    println("정렬된 카드 목록:")
    for (card in sortedCards) {
        println("값: ${card.value}, 색: ${card.color}")
    }
}

4. 코드 설명

위의 코드에서 각 구성 요소를 설명하겠습니다:

  • data class Card: 카드의 값과 색깔을 포함하는 데이터 클래스를 정의합니다.
  • colors map: 카드의 색깔을 정수로 매핑한 맵을 생성합니다. 이후 정렬 시 이 값을 참조합니다.
  • cards list: 주어진 카드 목록을 리스트로 생성합니다.
  • sortedWith: 카드 리스트를 값과 색깔에 따라 정렬합니다. 이때 compareBy를 사용하여 여러 기준으로 정렬할 수 있습니다.

5. 결과 확인하기

프로그램을 실행하면 아래와 같은 결과가 출력됩니다:

정렬된 카드 목록:
값: 1, 색: 클럽
값: 2, 색: 하트
값: 2, 색: 스페이드
값: 3, 색: 다이아몬드
값: 3, 색: 하트

결론

이번 강좌에서는 카드 정렬하기 문제를 다루며, 정렬 알고리즘을 통한 문제 해결 과정과 코틀린 코드 구현에 대해 살펴보았습니다. 다양한 데이터 구조와 알고리즘을 이해하는 것은 코딩 테스트에서 중요한 요소이므로, 계속해서 연습하면 많은 도움이 될 것입니다. 다음 강좌에서도 흥미로운 문제를 다루도록 하겠습니다. 감사합니다!