본문 바로가기
스터디(beakjoon)

Kotlin] 백준 2238번 풀이

by 김마리님 2024. 9. 1.

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

 

더보기

(사실 자신없고,, 코드 드러움. 나은 해결책 찾는 중)

 

이 문제의 핵심은

 

1. 가장 적게 불린 가격을 찾기.

2. 불린 횟수가 같다면 비교해서 가장 낮은 값 찾기.

3. 낮은 값까지 찾았다면 제일 먼저 그 수를 부른 사람 찾기

 

이 세 가지가 핵심입니다.

저같은 경우는 해시맵으로 풀었습니다. 해시 맵 두 개를 선언합니다. 하나는 <가격 : 카운트>, 다른 하나는 <가격 : 이름>으로 만듭니다.

 

만약 이 가격이 불린 적이 없다면 카운트 해시에 키 : 값 쌍을 넣고, 이름 해시에도 동일하게 키 : 값 쌍을 넣습니다. 만약 해당 가격이 불린 적이 있다면 가격 : 카운트의 value 만 + 1합니다.

 

해시맵 세팅이 끝났다면 가격과 카운트 변수를 설정해둡니다(이 때, 가장 작은 값을 골라야하기 때문에, 선택할 수 있는 경우의 수 중 가장 높은 값으로 세팅해둬야 합니다. 그것이 첫 줄의 가격, 사람 수 입니다. 이 값으로 미리 가격 변수, 카운트 변수를 초기화 해둡니다.)

<가격 : 카운트> 맵을 돌면서 value가 카운트 변수보다 낮거나, value가 같지만 키 값이 기존보다 낮을 경우, 변수의 값을 변경합니다.

 

맵 전체를 돌았다면 해당 맵에서 가장 적게 불린 횟수의 가격 중 가장 낮은 가격을 얻을 수 있습니다.

이 가격으로 <가격, 이름> 해시의 키 값을 넣으면 value(이름) 이 나옵니다.

 

이를 코드로 짜면

import kotlin.math.min

fun main(args: Array<String>) {
    question2238()
}

fun question2238() {
    val case = readln().split(" ").map { it.toInt() }

    // 가장 적게 불린 카운트를 찾기 위함임
    var count = HashMap<Int, Int>()

    // 누가 먼저 불렀는지 확인하기 위함
    var name = HashMap<Int, String>()

    for(i in 1 .. case[1]) {
        val user = readln().split(" ")
        val userName = user[0]
        val userPrice = user[1].toInt()
        if(count[userPrice] == null) {
           count[userPrice] = 1
           name[userPrice] = userName
        } else {
            count[userPrice] = count[userPrice]!! + 1
        }
    }

    var minCount = case[1]
    var minPrice = case[0]
    for ((key, value) in count) {
        if((value < minCount) || (value == minCount && key < minPrice)) {
            minCount = value
            minPrice = key
        }
    }
    
    println("${name[minPrice]} $minPrice")
}

 

반응형

'스터디(beakjoon)' 카테고리의 다른 글

Kotlin] 백준 1676번 풀이  (0) 2024.09.09
Kotlin] 백준 9536번 풀이  (0) 2024.09.01
Kotlin] 백준 1158번 풀이  (0) 2024.09.01
Kotlin] 백준 2606 풀이  (0) 2024.05.23
Kotlin] 백준 15128번 문제 풀이  (0) 2024.05.17