[programmers]가장 많이 받은 선물 kotlin

quinones·2024년 1월 5일

1단계문제는 다풀었는데, 새로 나온문제라니 못참고 풀어버렸다..
프로그래머스 가장많이받은선물


제한사항을 보니 어떻게든 풀기만해도 시간복잡도는 문제없어보였다.
생각나는대로 Map을 만들고, 문제에서 말하는대로 값들을 넣어줬다.

class Solution {
    fun solution(friends: Array<String>, gifts: Array<String>): Int {
        var answer: Int = 0
        //누가 누구에게 선물을 줬는지
        var whoGiveGift = mutableMapOf<String, MutableList<String>>()

        var presentReceive = mutableMapOf<String, Int>()
        var presentGive = mutableMapOf<String, Int>()
        //선물지수 저장
        var presentPercent = mutableMapOf<String, Int>()
        //최종적으로 그사람이 받을 선물 개수
        var finalReceivePresent = mutableMapOf<String, Int>()

        gifts.forEach {
            val split = it.split(" ")
            val giver = split.first()
            val receiver = split.last()
            //맵에 이미 키가 존재하면 추가, 없으면 새로운 리스트 생해서 선물추가
            whoGiveGift.computeIfAbsent(giver) { mutableListOf() }.add(receiver)
            //해당 키값이 존재하면 기존값, 없으면 0을 반환, 거기에 1추가 -> 그 사람이 준 선물 개수 저장.
            presentGive[giver] = presentGive.getOrDefault(giver, 0) + 1
        }
        friends.forEach {
            val receivedGift = whoGiveGift.values.flatten().count { giver -> giver == it }
            // 내가 받은 선물의 개수.
            presentReceive[it] = receivedGift
            // 선물지수 저장.
            presentPercent[it] = (presentGive[it] ?: 0) - (presentReceive[it] ?: 0)

            finalReceivePresent[it]=0 // 먼저 각 사람들이 받을 선물개수를 0개로 저장.
        }
        for (i in 0 until friends.size) {
            var me = friends[i]
            var maxValue = Int.MIN_VALUE
            for (j in 0 until friends.size) {
                var other = friends[j]
                if (i != j) {
                    val giftToOther = whoGiveGift[me]?.count { it == other } ?: 0 //내가 그사람에게 준 선물 개수
                    val giftToMe = whoGiveGift[other]?.count { it == me } ?: 0 //내가 그사람에게 받은 선물 개수
                    if(giftToOther>giftToMe){
                        //내가 상대방보다 선물을 많이 해줬으면 받는선물1 증가
                        finalReceivePresent[me] = finalReceivePresent.getOrDefault(me, 0) + 1
                    } else if(giftToOther == giftToMe){
                        if(presentPercent[me]?:0 > presentPercent[other]?:0){
                            //선물개수가 같다면 선물지수 비교해서 내가 더크면 받는선물1증가
                            finalReceivePresent[me] = finalReceivePresent.getOrDefault(me, 0) + 1
                        }
                    }
                }
            }
            maxValue = maxOf(maxValue, finalReceivePresent[me]?:0)
            answer = maxOf(maxValue, answer)
        }

        return answer
    }
}

다 풀고보니

100명이 풀었다.! 뭔가 기분좋다 ㅎㅎ

profile
이우진

0개의 댓글