적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Algorithm/Programmers

[Swift 알고리즘] Programmers 가장 많이 받은 선물

hongssup_ 2024. 8. 12. 18:58
반응형

Level 1 2024 KAKAO WINTER INTERNSHIP (1시간)

 

Programmers 가장 많이 받은 선물

 

레벨 1이 한시간 걸릴 일인가요..!! ㅠㅠ 

카카오는 문제가 너무 길어서 읽고 이해하는데만 10분 걸림 ;; 

 

1. 두 친구 사이 선물 횟수 비교

-> 더 많이 준 사람에게 + 1

2. (선물 횟수가 같거나 없다면) 선물 지수 비교

-> 선물 지수 큰 사람에게 + 1

 

그냥 다 딕셔너리에 저장해버렸지만

문제에서 예시 보여준 처럼 2차원 배열로 만들어서 풀어줘도 될둣

print(solution(["muzi", "ryan", "frodo", "neo"], ["muzi frodo", "muzi frodo", "ryan muzi", "ryan muzi", "ryan muzi", "frodo muzi", "frodo ryan", "neo muzi"])) //2

print(solution(["joy", "brad", "alessandro", "conan", "david"], ["alessandro brad", "alessandro joy", "alessandro conan", "david alessandro", "alessandro david"])) //4

print(solution(["a", "b", "c"], ["a b", "b a", "c a", "a c", "a c", "c a"])) //0

func solution(_ friends:[String], _ gifts:[String]) -> Int {
    var giftCases = [String: Int]()
    var result = [String: Int]()
    for friend in friends {
        result[friend] = 0
        // 두 친구 사이 선물 횟수 비교
        for f in friends {
            if f != friend, giftCases[f + " " + friend] == nil {
                giftCases[friend + " " + f] = 0
            }
        }
    }
    
    var giveCounts = [String: Int]()
    var getCounts = [String: Int]()
    
    for gift in gifts {
        let names = gift.split(separator: " ").map { String($0) }
        giveCounts[names[0], default: 0] += 1
        getCounts[names[1], default: 0] += 1
        
        if giftCases[gift] != nil {
            giftCases[gift]! += 1
        } else if giftCases[names[1] + " " + names[0]] != nil {
            giftCases[names[1] + " " + names[0]]! -= 1
        }
    }
    
    for giftCase in giftCases {
        let names = giftCase.key.split(separator: " ").map { String($0) }
        if giftCase.value == 0 {
            // 선물 지수 비교
            let one = (giveCounts[names[0]] ?? 0) - (getCounts[names[0]] ?? 0)
            let two = (giveCounts[names[1]] ?? 0) - (getCounts[names[1]] ?? 0)
            if one - two > 0 { result[names[0]]! += 1 }
            if one - two < 0 { result[names[1]]! += 1 }
        } else {
            if giftCase.value > 0 {
                result[names[0]]! += 1
            } else {
                result[names[1]]! += 1
            }
        }
    }
    
    return result.values.max() ?? 0
}

 

어휴 복잡하다 복잡해.. 

이렇게 풀어도 되는걸까요.. ㅎ

728x90
반응형