연습장

28. 가장 많이 받은 선물 본문

프로그래머스/1단계

28. 가장 많이 받은 선물

js0616 2024. 1. 22. 19:50

 

 

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

 

 

 

'프로그래머스 > 1단계' 카테고리의 다른 글

1단계 후기  (1) 2024.01.22
29. 다트 게임  (1) 2024.01.22
27. 붕대 감기  (0) 2024.01.22
26. 신고 결과 받기  (1) 2024.01.22
25. 공원 산책  (0) 2024.01.22