[백준/Kotlin] 20920번. 영단어 암기는 괴로워

문제

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