Algorithm/문제풀이

[프로그래머스] Lv1. 가장 많이 받은 선물

지미닝 2024. 7. 26. 02:23

문제

https://school.programmers.co.kr/learn/courses/30/lessons/258712#

 

문제 설명

선물을 직접 전하기 힘들 때 카카오톡 선물하기 기능을 이용해 축하 선물을 보낼 수 있습니다. 당신의 친구들이 이번 달까지 선물을 주고받은 기록을 바탕으로 다음 달에 누가 선물을 많이 받을지 예측하려고 합니다.

  • 두 사람이 선물을 주고받은 기록이 있다면, 이번 달까지 두 사람 사이에 더 많은 선물을 준 사람이 다음 달에 선물을 하나 받습니다.
  • 두 사람이 선물을 주고받은 기록이 하나도 없거나 주고받은 수가 같다면, 선물 지수가 더 큰 사람이 선물 지수가 더 작은 사람에게 선물을 하나 받습니다.

위에서 설명한 규칙대로 다음 달에 선물을 주고받을 , 당신은 선물을 가장 많이 받을 친구가 받을 선물의 수를 알고 싶습니다.

 

 

문제 풀이

 이 문제는 파이썬을 조금 더 잘 알았더라면 잘 풀었을지도 모르겠네.. 일단 리스트 원툴이니 리스트를 활용하였고, x->y로 준다고 가정했을 때 2차원 리스트를 생성해서 x->y에게 몇번 주었는지 저장했다. 이와 동시에 이렇게 저장한다면, gift[x]의 합은 x가 준 횟수가 되고 gift[*][x]의 합은 누군가에게 받은 횟수가 된다.

 

그러면 문제가 굉장히 쉬워진다.

 

그런데 딕셔너리를 활용했다면 더 나았지 않았을까 싶기도 하다. 

 

 어떤 대단한 사람의 코드를 봤는데, 나는 이름을 index로 접근하여 한번 탐색하고 들어갔는데,

  f = {v: i for i, v in enumerate(friends)}

 이런 식으로 이름을 키로 해서 인덱스를 가지는 딕셔너리로 만들어버렸다. 흠냐 대단하군...

 

어떤 사람은 2*n + n**2로 푸셨는데 뭐 나랑 그냥저냥 저거빼곤 비슷한 것 같아서 요정도 하겠다. 딕셔너리 쓰는걸 좀 익히면 사기 될 것 같은 느낌이 스멀스멀 드네.

 

최종 코드

def solution(friends, gifts):
    answer = 0
    gift_count = [ [0]*len(friends) for _ in range(len(friends))] 
    # gift_count[x][y]: x -> y에게 주다.
    # 곧, x의 전체 합을 구하면 줬던 횟수를 모두 계산할 수 있음ㅇㅇ 받았던 횟수는 gift_count[][x]로 조회 가능!
    
    for gift in gifts:
        a,b = gift.split()
        gift_count[friends.index(a)][friends.index(b)] += 1
        
    for i in range(len(friends),0,-1):
        gift = 0
        for j in range(len(friends),0,-1):
            if(friends[i-1]==friends[j-1]): 
                continue
            if gift_count[i-1][j-1] - gift_count[j-1][i-1] > 0: 
                gift += 1
            elif gift_count[i-1][j-1] == gift_count[j-1][i-1]:
                if calculate_rate(gift_count, i-1) > calculate_rate(gift_count, j-1):
                    gift += 1
                

        if gift > answer:
            answer = gift
    
    return answer

def calculate_rate(gift_count, x):
    plus = sum(gift_count[x])
    minus = 0
    for i in range(len(gift_count)):
        minus += gift_count[i][x]
    return plus - minus