Post

[프로그래머스] 가장 많이 받은 선물 (2024 KAKAO WINTER INTERNSHIP) - Python

문제

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


아이디어

  1. A가 B에게 선물을 주는 것을 카운트하기 위해 해시맵(딕셔너리)을 활용했다.

  2. 다음달에 가장 많은 선물을 받은 사람을 찾기 위해, 각각의 친구에 대해 다음 달에 받을 선물 개수를 계산한다.
    이 때 주어진 friends의 길이가 최대 50이므로 2중 for문을 사용했다.

  3. a가 b로부터 선물을 받을 수 있는 경우는 2가지 경우가 있다.

    • a가 더 많이 준 경우

    • 똑같이 주고 받았거나 아예 주고 받지 않았을 때, a의 선물 지수가 더 큰 경우
      참고로, 선물 지수는 입력값인 gifts를 처리할 때 함께 계산할 수 있다. (누군가에게 주면 +1, 받으면 -1)

      1
      2
      3
      4
      5
      6
      7
      
        gift = {f: {f: 0 for f in friends} for f in friends}
        point = {f: 0 for f in friends}
        for g in gifts:
            a, b = g.split()
            gift[a][b] += 1
            point[a] += 1
            point[b] -= 1
      

    그럼 다음과 같이 최대값을 탐색할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    
     answer = 0
     for a in friends:
         cnt = 0
         for b in friends:
             if a != b:
                 if gift[a][b] > gift[b][a] or (gift[a][b] == gift[b][a] and point[a] > point[b]):
                     cnt += 1
         answer = max(answer, cnt)
    


전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def solution(friends, gifts):
    answer = 0
    gift = {f: {f: 0 for f in friends} for f in friends}
    point = {f: 0 for f in friends}
    for g in gifts:
        a, b = g.split()
        gift[a][b] += 1
        point[a] += 1
        point[b] -= 1
    for a in friends:
        cnt = 0
        for b in friends:
            if a != b:
                if gift[a][b] > gift[b][a] or (gift[a][b] == gift[b][a] and point[a] > point[b]):
                    cnt += 1
        answer = max(answer, cnt)
    return answer
This post is licensed under CC BY 4.0 by the author.