https://www.acmicpc.net/problem/1302
난이도 : 실버 3
태그 : 자료 구조, 문자열, 정렬, 해시를 사용한 집합과 맵
설명
이 문제 같은 경우, 문자열 별로 카운트를 해야 하므로,
해시맵을 유용하게 쓸 수 있겠습니다.
소스코드
fun main(): Unit = with(System.`in`.bufferedReader()) {
val hashMap = HashMap<String, Int>()
repeat(readLine().toInt()) {
val bookTitle = readLine()
// 이전에 해시맵에 없던 데이터라면 기본적으로 0, 이미 있던 데이터라면 + 1
hashMap[bookTitle] = hashMap.getOrDefault(bookTitle, 0) + 1
}
// hashMap의 value 기준 정렬, 동일하면 key 기준 정렬
val sortedList = hashMap.toList().sortedWith(compareBy({ -it.second }, { it.first }))
println(sortedList[0].first)
}
기존의 해시맵에 없던 데이터라면, getOrDefault를 사용해 디폴트 값을 주어 쉽게 다룰 수 있습니다.
이전에 없던 데이터라면 0, 값을 가지고 있던 데이터라면 + 1를 해줍니다.
마지막으로, 해시맵을 리스트로 변형하면 List<Pair> 구조로 반환됩니다.
Pair 자료구조는 이름처럼, 두 개의 쌍을 이루는 자료구조로, 앞의 것은 first, 뒤의 것은 second로 접근할 수 있습니다.
리스트로 변형한 뒤, sortedWith와 compareBy를 사용해 다중 조건 정렬을 하였는데,
secon 기준 (value, 책이 나온 횟수)으로 내림차순 정렬 후, first 기준 (key, 책의 이름)으로 오름차순 정렬합니다.
내림차순 정렬은 앞에 -를 붙여 손쉽게 할 수 있습니다.
후기
해쉬를 떠올리고, 카운팅하는 것 까진 쉬웠는데,
어떻게 정렬을 하지? 하면서 고민했는데,
그냥 toList()로 리스트로 변환 후 정렬하는게 가장 대표적인 방법인 것 같더군요.
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 11004번] [Kotlin] K번째 수 (0) | 2023.02.12 |
---|---|
[백준 4485번] [Kotlin] 녹색 옷 입은 애가 젤다지? (0) | 2023.02.10 |
[백준 15666번] [Kotlin] N과 M (12) (0) | 2023.02.09 |
[백준 15665번] [Kotlin] N과 M (11) (1) | 2023.02.09 |
[백준 15664번] [Kotlin] N과 M (10) (0) | 2023.02.09 |