안녕하세요! 이번 코틀린 코딩테스트 강좌에서는 “카드 정렬하기”라는 흥미로운 문제를 다루겠습니다. 알고리즘 문제를 해결하는 과정에서 중요한 논리적 사고와 다양한 자료 구조에 대한 이해도를 높일 수 있는 기회가 될 것입니다.
문제 설명
문제는 주어진 카드들을 정렬하는 것입니다. 각 카드는 다음과 같은 정보로 구성되어 있습니다:
- 값: 카드의 수치 (예: 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, 색: 하트
결론
이번 강좌에서는 카드 정렬하기 문제를 다루며, 정렬 알고리즘을 통한 문제 해결 과정과 코틀린 코드 구현에 대해 살펴보았습니다. 다양한 데이터 구조와 알고리즘을 이해하는 것은 코딩 테스트에서 중요한 요소이므로, 계속해서 연습하면 많은 도움이 될 것입니다. 다음 강좌에서도 흥미로운 문제를 다루도록 하겠습니다. 감사합니다!