문제
https://www.acmicpc.net/problem/20920
풀이
특정 길이 M 이상의 문자열을 입력받아 아래의 3가지의 조건으로 정렬하는것이 핵심이다.
1. 각 단어별 등장횟수를 기록해둔 숫자를 내림차순
2. 등장 횟수가 같다면 단어의 길이로 내림차순
3. 단어의 길이가 같다면 알파벳순
단어별 등장 횟수 기록은 아래와 같은 가변 map을 사용한다.
val words = mutableMapOf<String, Int>()
이 map에 문자열과 그 등장 횟수를 저장하기 위해 아래와 같이 getOrDefault를 이용했다.
words에 word라는 값이 존재하면 그 값을, 아니라면 0을 반환하게 된다.
words.getOrDefault(word, 0)
따라서 처음 등장한다면 0을 그렇지 않다면 현재 몇번 등장했는지의 값을 얻어올 수 있고
이 값에 1을 증가시킨 값을 다시 저장하여 구현한다.
이제 값을 저장했으니 정렬을 할 차례이다.
val sortedWords = words.keys.sortedWith(
compareByDescending<String> { words[it] } // 등장 횟수 내림차순
.thenByDescending { it.length } // 단어 길이 내림차순
.thenBy { it } // 알파벳 순
)
words라는 이름을 가진 map의 key를 정렬할 것이므로 word.key로 접근한 뒤 sortedWith을 사용해 정렬한다
이때 compareBy, compareByDescending 등의 비교자를 인자로 받아 정렬 기준을 설정할 수 있으며 이때 기준에 동률이 발생하면 thenBy, thenByDescending을 이용해 동률 간의 정렬 기준을 설정할 수 있다.
정답 코드
fun main() {
val (n, m) = readln().split(" ").map { it.toInt() }
val words = mutableMapOf<String, Int>()
for (i in 1..n) {
val word = readln()
if (word.length < m) {
continue
}
words[word] = words.getOrDefault(word, 0) + 1
}
val sortedWords = words.keys.sortedWith(
compareByDescending<String> { words[it] } // 등장 횟수 내림차순
.thenByDescending { it.length } // 단어 길이 내림차순
.thenBy { it } // 알파벳 순
)
println(sortedWords.joinToString("\n"))
}
파이썬 버전의 풀이와 코드는 다음 포스팅 참조
[백준/Python] 20920번. 영단어 암기는 괴로워
문제https://www.acmicpc.net/problem/20920 풀이특정 길이 이상의 문자열을 입력받아 아래의 3가지의 조건으로 정렬하는것이 핵심이다. 1. 각 단어별 등장횟수를 기록해둔 숫자를 내림차순2. 등장 횟
medandro.com
'알고리즘 > 백준' 카테고리의 다른 글
[백준/Kotlin] 1515번. 수 이어 쓰기 (0) | 2025.02.05 |
---|---|
[백준/Python] 1515번. 수 이어 쓰기 (0) | 2025.02.05 |
[백준/Python] 20920번. 영단어 암기는 괴로워 (0) | 2025.02.04 |
[백준/Python] 11726번. 2×n 타일링 (0) | 2024.11.20 |
[백준/Python] 21314번. 민겸 수 (0) | 2024.11.17 |