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명이 풀었다.! 뭔가 기분좋다 ㅎㅎ