단어정렬은 실버5 문제로 비교적 간단한 문제입니다.
그렇지만 코틀린의 활용 여부에 따라 코드의 길이와 구현 방법이 달라질 수 있음을 명확히 보여주는 문제입니다.
이 문제의 3가지 서로 다른 풀이법을 알아보겠습니다.
문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다.
예제 입력
예제 입력 | 예제 출력 |
13 but i wont hesitate no more no more it cannot wait im yours |
i im it no but more wait wont yours cannot hesitate |
첫 번째 풀이
가장 먼저 생각한 방법은 직접 두 조건에 대한 정렬 코드를 구현해 주는 것입니다.
- Map<글자수, [문자1, 문자2, 문자3]> 형태로 map을 생성해 준다.
- map의 key값을 정렬해 준 뒤 각 key값에 해당하는 문자들을 정렬을 해준다.
fun main() {
val arr = Array(readln().toInt()) {readln()}
val group = arr.groupBy { it.length } // 글자수 기준으로 그룹화 Map<글자수, [문자1, 문자2, 문자3]>
for (i in group.keys.sorted()) { // key값 정렬해서 반복문
val words = group.get(i)!!.toSet()!!.sorted() // 각 문자들 중복제거 후 정렬
for (j in words.indices) {
println(words[j]) // 단어 출력
}
}
}
groupBy 메서드로 Map 형식으로 변환하는 번거로운 작업을 간단하게 처리할 수 있습니다.
두 번째 풀이
첫 번째 방법처럼 수작업으로 정렬하는 방법이 있지만 Comparator, Comparable를 사용하면 한 번에 정렬 기준을 설정하여 정렬할 수 있습니다.
fun main() {
val n = readln().toInt()
var set = mutableSetOf<String>() // 입력값을 바로 Set으로 받아서 중복을 없애줌
repeat(n) {
set.add(readln())
}
// Comparator로 정렬 기준을 직접 구현
val customComparator = Comparator<String> { s1, s2 ->
if (s1.length < s2.length) {
-1
} else if (s1.length > s2.length) {
1
} else {
s1.compareTo(s2)
}
}
// 만든 Comparator 적용한 뒤 출력
set.sortedWith(customComparator).forEach {
println(it)
}
}
세 번째 풀이
Comparator 객체를 직접 생성하기 않고 코틀린에서 제공하는 compareBy 메서드로 손쉽게 정렬 기준을 설정할 수 있습니다.
그 밖에도 중복 요소를 제거하는 distinct 메서드와 리스트 요소를 문자열로 결합하는 joinToString 메서드 등의 내장 메서드를 활용하면 아래와 같이 코드를 간결하게 작성할 수 있습니다.
fun main() {
List(readln().toInt()) { readln() }
.distinct() // 중복 제거
.sortedWith(compareBy({ it.length }, { it })) // 정렬 기준 설정
.joinToString("\n") // 문자열 결합 방법
.let(::print) // 출력
}
마지막 풀이가 가장 가독성이 좋으며 코틀린의 내장 메서드를 가장 잘 활용한 풀이라고 생각합니다.
번외
2023. 10. 1 ~ 2023. 10. 14 백준 실버 랭크에 달성
브론즈 문제는 거의 막힘 없이 풀 수 있었지만, 실버부터는 조금씩 어려워지는 거 같습니다.
'코딩테스트 > 백준 코틀린' 카테고리의 다른 글
[6개월 안에 백준 플래티넘 달성하기] 6. 색종이 만들기 2630 | 코틀린 (0) | 2023.10.31 |
---|---|
[6개월 안에 백준 플래티넘 달성하기] 5. 1로 만들기_1463 | 코틀린 (0) | 2023.10.26 |
[6개월 안에 백준 플래티넘 달성하기] 4. 마인크래프트_18111 | 코틀린 (0) | 2023.10.24 |
[6개월 안에 백준 플래티넘 달성하기] 2. 기초 문제에서 사용한 코틀린 메서드 정리 (0) | 2023.10.08 |
[6개월 안에 백준 플래티넘 달성하기] 1.목표 설정하기 (0) | 2023.10.01 |
댓글