연습장
28. 가장 많이 받은 선물 본문
friends = [ 친구 ]
gifts = [선물을 주는사람 받는사람 , .... ]
1. 두 사람간에 많이 더 많이 준 사람이 선물을 1개 받습니다.
2. 주고받지 않았거나 같다면 -> 선물지수가 큰 사람이 1개 받습니다. -> 선물 지수도 같다면 주고받지않습니다.
다음달에 선물을 가장 많이 받는 친구와 갯수는 ?
뭔말인지 이해가 잘 안간다..
1. muzi 의 경우
ryan | frodo | neo | |
주다 | 0 | 2 | 0 |
받다 | 3 | 1 | 1 |
결과 | x | o | x |
총 1개를 받는다.
2. ryan 의 경우
muzi | frodo | neo | |
주다 | 3 | 0 | 0 |
받다 | 0 | 1 | 0 |
결과 | o | x | = --> o |
총 2개를 받는다.
3. frodo 의 경우
muzi | ryan | neo | |
주다 | 1 | 1 | 0 |
받다 | 2 | 0 | 0 |
결과 | x | o | x |
총 1개를 받는다.
4. neo 의 경우
muzi | ryan | frodo | |
주다 | 1 | 0 | 0 |
받다 | 0 | 0 | 0 |
결과 | o | x | o |
총 2개를 받는다.
최대 2개를 받으므로 -> 2를 return 하면 된다.
사실상 1:1 의 관계에서 선물을 둘중 1명은 무조건 받게되는데..
생각을 해보면
다음과 같이 4명의 경우 총 6개의 선물이 오고 간다. 여기서 봐야하는건
muzi의 경우 frodo와의 관계에서 선물을 받고 나머지는 받지 못하게 되는데
반대로말하면 나머지 두사람(ryan, neo) 이 선물을 받는다는 뜻이다.
그 다음 ryan 의 경우 muzi 를 제외한 2명과의 관계를 확인하면 되는데
다음과 같이 frodo에게는 받지못하고 neo 에게 받는다.
다음으로 frodo 의 경우 neo 에게 받지 못한다.
그러면 neo 는 확인하지 않아도 결과를 알 수 있다.
그래서 코드를 어떻게 짜야되나.. ?
1. 선물 지수를 만든다.
2. 다음달 선물 딕셔너리를 만든다.
3. 1:1 로 비교해서 채운다.
0번 : 1 번 , 2번, 3번, 4번 , ... n번
1번 : 2번, 3번, 4번 ... n 번
2번 : 3번 , 4번 , ... n 번
n-1번: n 번
종료
def solution(friends, gifts):
answer = 0
gifts.sort()
# 1. 선물지수
gift_num = {}
next_month = {} # 2. 다음달 선물 갯수
for i in friends:
gift_num[i] = 0
next_month[i] = 0
for i in gifts:
gift_num[i.split(' ')[0]] += 1
gift_num[i.split(' ')[1]] -= 1
# 3. 비교
for i in range(len(friends)-1): # 0번부터 n-1 번까지
main_fd = friends[i]
for j in range(i+1,len(friends)): # i+1 부터 n 까지
sub_fd = friends[j]
give = main_fd+' '+sub_fd
get = sub_fd+' '+main_fd
if gifts.count(give) > gifts.count(get):
next_month[main_fd] += 1
elif gifts.count(give) < gifts.count(get):
next_month[sub_fd] += 1
else :
if gift_num[main_fd] > gift_num[sub_fd]:
next_month[main_fd] += 1
elif gift_num[main_fd] < gift_num[sub_fd]:
next_month[sub_fd] += 1
# 제일 큰 값
answer = 0
for i in next_month:
if next_month[i] > answer:
answer = next_month[i]
return answer