Uknow's Lab.
article thumbnail

https://www.acmicpc.net/problem/1302

 

1302번: 베스트셀러

첫째 줄에 오늘 하루 동안 팔린 책의 개수 N이 주어진다. 이 값은 1,000보다 작거나 같은 자연수이다. 둘째부터 N개의 줄에 책의 제목이 입력으로 들어온다. 책의 제목의 길이는 50보다 작거나 같고

www.acmicpc.net

 

난이도 : 실버 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()로 리스트로 변환 후 정렬하는게 가장 대표적인 방법인 것 같더군요.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.