본문 바로가기
코딩테스트

[2024 KAKAO WINTER INTERNSHIP]가장 많이 받은 선물 [파이썬]

by 우지uz 2024. 1. 10.

문제 설명

문제 풀이

from pprint import pprint

def solution(friends, gifts):
    friends = sorted(set(friends))
    give_cnt = {friend : 0 for friend in friends} # 준 횟수
    receive_cnt = {friend : 0 for friend in friends} # 받은 횟수
    present_cnt = {friend : 0 for friend in friends} # 선물 지수
    next_month_cnt = {friend : 0 for friend in friends} # 다음달에 받는 횟수
    gr_records = {
        friend: {other: [0, 0] for other in set(friends) - {friend}}
        for friend in friends
    } # 주고 받는 횟수 기록 : 딕셔너리 - 초기화
    
    for gift in gifts:
        giver, receiver = gift.split(" ")
        give_cnt[giver] += 1
        receive_cnt[receiver] += 1
        gr_records[giver][receiver][0] += 1
        gr_records[receiver][giver][1] += 1
        # 주고 받는 횟수 기록
    # pprint(gr_records)
    give_cnt_list = list(give_cnt.values())
    receive_cnt_list = list(receive_cnt.values())
    present_cnt_list = list(present_cnt.values())
    present_cnt_list = [give_cnt_list[i] - receive_cnt_list[i] for i in range(len(friends))]
    present_cnt = {friend : present_cnt_list[i] for i, friend in enumerate(friends)}
    
    for i in range(len(friends)-1):
        friend = friends[i]
        # print(friend)
        others = friends[i+1:]
        # print(others)
        for other in others:
            AtoB = gr_records[friend][other][0] # A 가 B 에게 준 것
            BtoA = gr_records[friend][other][1] # A 가 B 에게 받은 것
            if AtoB > BtoA:
                next_month_cnt[friend] += 1
            elif AtoB < BtoA:
                next_month_cnt[other] += 1
            elif AtoB == BtoA :
                if present_cnt[friend] > present_cnt[other]:
                    next_month_cnt[friend] += 1
                elif present_cnt[friend] < present_cnt[other]:
                    next_month_cnt[other] += 1
                else:
                    next_month_cnt[other] += 0
    # print(next_month_cnt)
    answer = max(list(next_month_cnt.values()))
    
    return answer

전체 풀이 코드입니다. 

먼저 준 횟수, 받은 횟수, 선물 지수, 다음 달에 받는 횟수, 주고 받은 전체 레코드를

give_cnt
receive_cnt
present_cnt
next_month_cnt
gr_records
로 정의 했고 

 

for gift in gifts:
    giver, receiver = gift.split(" ")

gifts 에서 각 gift 의 giver와 receiver를 정의해주었습니다.

split(" ") 로 중간에 띄워쓰기를 기준으로, 두개의 문자열로 나눠주었습니다. 

 

가장 헷갈리고, 의아한 부분이 if elif elif 로직이었는데 

for other in others:
    AtoB = gr_records[friend][other][0] # A 가 B 에게 준 것
    BtoA = gr_records[friend][other][1] # A 가 B 에게 받은 것
    if AtoB > BtoA:
        next_month_cnt[friend] += 1
    elif AtoB < BtoA:
        next_month_cnt[other] += 1
    elif AtoB == BtoA :
        if present_cnt[friend] > present_cnt[other]:
            next_month_cnt[friend] += 1
        elif present_cnt[friend] < present_cnt[other]:
            next_month_cnt[other] += 1
        else:
            next_month_cnt[other] += 0

를 

if (AtoB != 0 | BtoA != 0) & (AtoB == BtoA):
    if AtoB > BtoA:
        next_month_cnt[friend] += 1
    elif AtoB < BtoA:
        next_month_cnt[other] += 1
elif AtoB == BtoA :
    if present_cnt[friend] > present_cnt[other]:
        next_month_cnt[friend] += 1
    elif present_cnt[friend] < present_cnt[other]:
        next_month_cnt[other] += 1
    else:
        next_month_cnt[other] += 0

로 했었는데, if (AtoB != 0 | BtoA != 0) & (AtoB == BtoA): 를 할 필요도 없었는데

이게 무슨 의미가 있을까 ? 라는 의문이 들어서 이해해보려고 했지만 

필요 없는 로직이라 그냥 삭제했습니다 ..

 

아시는 분 계시면, 댓글 달아주세효 ㅠㅠ