문제 링크
풀이 과정
본 문제는 코드 상에 풀이 과정을 제시하였습니다.
전체 코드
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]
Python
복사