문제 링크

풀이 과정

본 문제는 코드 상에 풀이 과정을 제시하였습니다.

전체 코드

from collections import defaultdict
from itertools import combinations

def solution(friends, gifts):
    '''
    1. 각 유저별 선물 받은 횟수 -> given_counts_dict
    2. 각 유저별 선물 한 횟수 -> give_counts_dict
    3. 상호작용 정보 -> interaction_dict
    4. 앞으로 선물을 받아야할 횟수 -> will_given_counts
    5. 선물 지수 -> score_dict
    6. 정산 정보 -> final_dict
    '''
    answer = []
    given_counts_dict = defaultdict(int)
    give_counts_dict = defaultdict(int)
    interaction_dict = defaultdict(dict)
    will_given_counts = {user: 0 for user in friends}
    score_dict = defaultdict(dict)

    for gift in gifts:
        give_user = gift.split(' ')[0]
        given_user = gift.split(' ')[1]
        # 선물 한 사람
        if give_user in give_counts_dict:   give_counts_dict[give_user] += 1
        else:   give_counts_dict[give_user] = 1
        # 선물 받은 사람
        if given_user in given_counts_dict: given_counts_dict[given_user] += 1
        else:   given_counts_dict[given_user] = 1
        # 상호 작용 계산 (선물을 준 횟수 기준)
        if given_user in interaction_dict[give_user]:
            interaction_dict[give_user][given_user] += 1
        else:   interaction_dict[give_user][given_user] = 1

    # 선물 지수 계산
    for user in friends:
        score_dict[user] = give_counts_dict[user] - given_counts_dict[user]

    # 받을 선물 계산
    for combs in combinations(friends, 2):
        user1, user2 = combs[0], combs[1]        
        # 1. user1만 선물 받은 경우
        if user1 in interaction_dict[user2] and user2 not in interaction_dict[user1]:
            will_given_counts[user2] += 1
        # 2. user2만 선물 받은 경우
        elif user1 not in interaction_dict[user2] and user2 in interaction_dict[user1]:
            will_given_counts[user1] += 1
        # 3. user1, 2가 서로 선물 주고 받은 경우, user1, 2가 서로 선물을 주고 받지 않은 경우
        elif (user1 in interaction_dict[user2]) and (user2 in interaction_dict[user1]):
            if interaction_dict[user2][user1] > interaction_dict[user1][user2]:
                will_given_counts[user2] += 1
            elif interaction_dict[user2][user1] < interaction_dict[user1][user2]:
                will_given_counts[user1] += 1
            elif interaction_dict[user2][user1] == interaction_dict[user1][user2]:
                user1_score, user2_score = score_dict[user1], score_dict[user2]
                if user1_score == user2_score:      pass
                elif user1_score > user2_score:     will_given_counts[user1] += 1
                elif user1_score < user2_score:     will_given_counts[user2] += 1
        # 4. user1, 2가 서로 선물을 주고 받지 않은 경우
        elif (user1 not in interaction_dict[user2]) and (user2 not in interaction_dict[user1]):
            user1_score, user2_score = score_dict[user1], score_dict[user2]
            if user1_score == user2_score:      pass
            elif user1_score > user2_score:     will_given_counts[user1] += 1
            elif user1_score < user2_score:     will_given_counts[user2] += 1
          
    # 결과 정리
    for user in will_given_counts.keys():
        answer.append(will_given_counts[user])
    
    return sorted(answer)[-1]