Kotlin/Algorithm Problems

<프로그래머스> 가장 많이 받은 선물(Lv.1)

re트 2024. 2. 22. 14:05
728x90

[깃허브]

https://github.com/heesoo-park/ForCodeKata/tree/main/%EA%B0%80%EC%9E%A5%20%EB%A7%8E%EC%9D%B4%20%EB%B0%9B%EC%9D%80%20%EC%84%A0%EB%AC%BC

[프로그래머스]

https://school.programmers.co.kr/learn/courses/30/lessons/258712

제출 결과

 

오늘도 복습을 하려다가 조금 뭔가 그래서 오늘부터는 카카오 코딩테스트 기출문제를 풀어보려고 한다.

가장 최근인 2024 KAKAO WINTER INTERNSHIP의 가장 쉬운 문제를 잡았다.

그리고 문제를 보는데 무슨 길이가...!!

사실 문제가 길다는 건 더욱 자세히 설명해준다는 것으로도 해석되기 때문에 문제를 푸는 과정이 좀 쉬워지긴 하지만 그래도 좀 압도되는게 있다.

마음을 가라앉히고 차분히 읽어보니 해야되는 과정은 순차적이었다.

먼저 선물을 주고받은 내역을 정리하고 두사람씩 비교하면서 더 선물을 많이 준 사람이 있을 때 다음달 선물을 받도록 하고 둘이 준 횟수가 같다면 선물 지수를 확인해서 더 작은 사람이 다음달 선물을 받도록 하면 되더라

선물 지수도 같다면 다음 달에 선물 받는 사람은 없다.

이렇게 모든 쌍을 비교하고 가장 많은 선물을 다음달에 받는 사람의 개수를 반환하면 끝!

 

위에 쓴 그대로 코드를 작성했다.

대신 문자열을 숫자로 바꾸는 해쉬맵을 추가했고 내역과 선물 지수를 위한 2차원배열을 최대 숫자 제한으로 생성했다.

내가 한 방식에서는 딱히 어려운 게 없었다.

다른 사람들의 풀이를 보면서 다른 접근 방식을 좀 봐야겠다.

 

해당 방법으로 작성한 코드는 다음과 같다.

class Solution {
    private val statistics = Array(50) { Array(50) { 0 } }
    private val giftIndex = Array(50) { Array(2) { 0 } }
    private val nextGift = Array(50) { 0 }
    private val mapper: HashMap<String, Int> = hashMapOf()
    fun solution(friends: Array<String>, gifts: Array<String>): Int {

        friends.forEachIndexed { index, friend ->
            mapper[friend] = index
        }

        gifts.forEach { gift ->
            gift.split(" ").let {
                val giftGiver = mapper[it[0]] ?: 0
                val giftTaker = mapper[it[1]] ?: 0
                statistics[giftGiver][giftTaker]++
                giftIndex[giftGiver][0]++
                giftIndex[giftTaker][1]++
            }
        }

        for (i in friends.indices) {
            for (j in i + 1 until friends.size) {
                if (statistics[i][j] > statistics[j][i]) {
                    nextGift[i]++
                } else if (statistics[i][j] < statistics[j][i]) {
                    nextGift[j]++
                } else {
                    val pos = compareGiftIndex(i, j)
                    if (pos != null) nextGift[pos]++
                }
            }
        }

        return nextGift.maxOf { it }
    }

    private fun compareGiftIndex(p1: Int, p2: Int): Int? {
        return when {
            giftIndex[p1][0] - giftIndex[p1][1] > giftIndex[p2][0] - giftIndex[p2][1] -> {
                p1
            }
            giftIndex[p1][0] - giftIndex[p1][1] < giftIndex[p2][0] - giftIndex[p2][1] -> {
                p2
            }
            else -> {
                null
            }
        }
    }
}
반응형