Algorithm (Python & Java)/구현

[KAKAO/Python] 가장 많이 받은 선물

DH_0518 2024. 4. 25. 12:05

 

'''
Goals
- 다음 달에 선물을 가장 많이 받을 친구가 받을 선물의 수

Conditions
- A,B 중 다음달 누가 선물을 받는가?
    - 선물 주고받은 수가 다른 경우
        - 둘 중, 덜 받은 사람이 다음달에 하나를 받음
    - 선물 주고받은 수가 같거나 없는 경우
        * 선물지수: (이번달까지) 선물 보낸 수 - 선물 받은 수
        - 선물 지수가 더 큰 사람이 선물을 받음
        - 선물 지수가 같다면 서로 주고받지 않음

Approach
- 구현
- 필요
    - A,B 선물을 '준' 횟수를 기록한 dict
    - 선물 지수 계산
    - 다음달 받을 선물 개수 계산
'''
from collections import defaultdict

def calc_give_count(friends:list, gifts:list, n:int):
    give_cnt_map = defaultdict(lambda: defaultdict(int))
    for data in gifts:
        giver, receiver = data.split()
        give_cnt_map[giver][receiver] +=1
    return give_cnt_map
    
def calc_gift_score(give_cnt_map:dict, friends:list):
    gift_score = defaultdict(int)
    for giver in friends:
        for receiver in give_cnt_map[giver]:
            give_cnt = give_cnt_map[giver][receiver]
            gift_score[giver] += give_cnt
            gift_score[receiver] -= give_cnt
    return gift_score
    
def calc_next_receive(give_cnt_map:dict, gift_score:dict, friends:list):
    best_receive_cnt = 0
    for name in friends:
        next_receive_cnt = 0
        for friend in friends:
            if name == friend: 
                continue
            give_cnt = give_cnt_map[name][friend]
            receive_cnt = give_cnt_map[friend][name]
            if give_cnt > receive_cnt: 
                next_receive_cnt +=1
            elif give_cnt < receive_cnt:
                continue
            else:
                if gift_score[name] > gift_score[friend]: 
                    next_receive_cnt +=1
        if next_receive_cnt > best_receive_cnt:
            best_receive_cnt = next_receive_cnt
    return best_receive_cnt
    
def solution(friends, gifts):
    n = len(friends)
    give_cnt_map = calc_give_count(friends, gifts, n)
    gift_score = calc_gift_score(give_cnt_map, friends)
    answer = calc_next_receive(give_cnt_map, gift_score, friends)
    return answer