선물을 준사람과 받은사람이 배열 gifts로 주어지게됩니다. gitfts의 값을 잘 가공해서,
이 문제에서는 말하는 선물지수를 구현해야 이문제를 풀 수 있습니다.
문제에서 설명하고 있는, 선물을 한개 더 받는 경우가 3가지 있습니다.
이 3가지 경우를 모두 찾아 내기 위해서는, 아래 2가지를 구현해야 합니다.
선물을 보낸사람, 받은 사람이 같은 경우를 카운트 해야 합니다.
각 friend가 선물을 보낸 수, 선물을 받은 수 를 알아야 합니다.
# 선물을 보낸 수, 선물을 받은수
sent_received: Dict = {}
# 선물을 주고 받은 관계를 키로, 선물의 개수를 저장합니다.
sender_receiver: Dict = defaultdict(int)
for f in friends:
# 선물의 개수를 저장하기 위해서 0, 0으로 초기화 합니다.
# 앞의 0이 선물을 보낸 수, 뒤에 0이 선물을 받은 수를 의미합니다.
sent_received[f] = [0, 0]
다음달에 친구들이 받을 선물을 저장할 변수 answer
answer[f] = 0
이제 선물을 주고 받은 사람을 저장하고 있는 gifts 배열을 사용해서, 주고 받은 선물의 개수를 저장합니다.
for sr in gifts:
# sender는 선물을 보낸 사람
# receiver는 선물을 받은 사람
sender, receiver = sr.split(‘ ‘)
# 선물 보낸 사람에게, 보낸 선물이 1증가
sent_received[sender][0] += 1
# 선물 받은 사람에게, 받은 선물이 1증가
sent_received[receiver][1] += 1
# 선물을 주고 받은 관계에 선물의 개수 1을 증가합니다.
sender_receiver[(sender, receiver)] += 1
이제 선물을 주고 받은 개수를 sent_received 딕셔너리에 모두 저장했으므로,
선물지수를 계산할 수 있습니다.
for key in sent_received.keys()
# v 선물지수는, 내가 보낸 선물개수 - 내가 받은 선물의 개수
v = sent_received[key][0] - sent_received[key][1]
# 이제, 내가 보낸 선물 개수, 내가 받은 선물 개수, 와 함께 선물지수도 함께 저장합니다.
sent_received[key] = [sent_received[key][0], sent_received[key][1], v]
# 이제 모든 친구들을 서로 비교 해서, 다음달에 받을 선물의 개수를 계산할 차례입니다.
# 선물을 보낸 친구 sender 입니다.
for sender in friends:
# 여기서 추가로 선물을 받을 개수를 저장할 변수를 선언합니다.
not_receiver_present_jisu = 0
for receiver in friends:
# 선물을 받은 친구 receiver 입니다.
# 보낸 사람과 받은사람이 같은 친구일 경우는, skip 합니다.
if sender == receiver:
continue
# 두 사람이 선물을 주고 받은 기록이 있다면
if ((sender, receiver) in sender_receiver.keys() \
or (receiver, sender) in sender_receiver.keys()):
# 두 사람 사이에 더 많은 선물을 준 사람이 다음 달에 선물을 하나 받습니다.
if sender_receiver[(sender, receiver)] > sender_receiver[(receiver, sender)]:
answer[sender] += 1
# 주고받은 수가 같다면,
elif sender_receiver[(sender, receiver)] == sender_receiver[(receiver, sender)]:
# 선물 지수가 더 큰 사람이, 선물을 하나 받습니다.
if sent_received[sender][2] > sent_received[receiver][2]:
not_receiver_present_jisu += 1
# 두 사람이 선물을 주고받은 기록이 하나도 없거나
else:
# 선물 지수가 큰 사람이, 선물을 하나 받습니다.
if sent_received[sender][2] > sent_received[receiver][2]:
not_receiver_present_jisu += 1
answer[sender] += not_receiver_present_jisu
이렇게 2중 루프를 모두 실행하고 나면, answer 에 각 친구들별로,
다음달에 받을 선물의 개수가 저장되어 있습니다.
values = list(answer.values())
return max(values)
선물의 최대값을 리턴해주면, 이문제의 답을 구할 수 있습니다.
댓글 없음:
댓글 쓰기