2024년 1월 31일 수요일

2024 KAKAO WINTER INTERNSHIP 가장 많이 받은 선물

 

선물을 준사람과 받은사람이 배열 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)


선물의 최대값을 리턴해주면, 이문제의 답을 구할 수 있습니다.

댓글 없음:

댓글 쓰기