문제 링크 (opens new window)

# 풀이

  • 빡구현이라고 불리는 문제를 처음 풀어봤는데 너무 지저분하다
import Foundation

func solution(_ friends:[String], _ gifts:[String]) -> Int {
    var giftRecord: [String: [String: Int]] = [:]
    var giftIndex: [String: Int] = [:]
    var numberOfNextMonthGift: [String: Int] = [:]
    var giftEnded: [String: [String:Bool]] = [:]

    for friend in friends {
        giftRecord[friend] = [:]
        giftIndex[friend] = 0
        numberOfNextMonthGift[friend] = 0
        giftEnded[friend] = [:]

        for f in friends {
            giftRecord[friend]![f] = 0
            giftEnded[friend]![f] = false
        }
    }

    for gift in gifts {
        let fromTo = gift.split(separator: " ").map { String($0) }
        giftIndex[fromTo[0]]! += 1
        giftIndex[fromTo[1]]! -= 1
        if let _ = giftRecord[fromTo[0]]![fromTo[1]] {
            giftRecord[fromTo[0]]![fromTo[1]]! += 1
        } else {
            giftRecord[fromTo[0]]![fromTo[1]] = 1
        }
    }

    for me in friends {
        // 주고받은 기록 살펴서 친구별로 선물지수 계산
        for (receivedFriend, numberOfGift) in giftRecord[me]! {
            // 상대가 나한테 준 선물 갯수가 내가 상대에게 준 선물 갯수랑 동일한 경우
            if giftEnded[receivedFriend]![me]! { continue }
            if giftEnded[me]![receivedFriend]! { continue }

            if giftRecord[receivedFriend]![me]! == numberOfGift {
                // 선물지수 계산 -> 선물지수 큰 사람이 작은 사람에게 받는다
                if giftIndex[receivedFriend]! > giftIndex[me]! {
                    numberOfNextMonthGift[receivedFriend]! += 1
                } else if giftIndex[receivedFriend]! < giftIndex[me]! {
                    numberOfNextMonthGift[me]! += 1
                }
            } else {
                // 상대가 더 많이 나한테 준 경우
                if giftRecord[receivedFriend]![me]! > numberOfGift {
                    numberOfNextMonthGift[receivedFriend]! += 1
                } else {
                    // 내가 더 많이 받은 경우 -> 상대에게 하나 주기
                    numberOfNextMonthGift[me]! += 1
                }
            }

            giftEnded[receivedFriend]![me]! = true
            giftEnded[me]![receivedFriend]! = true
        }
    }

    var maxGift = Int.min
    for gift in numberOfNextMonthGift {
        maxGift = max(maxGift, gift.value)
    }

    return maxGift
}