본문 바로가기
Algorithm/Programmers

[Programmers] Lv.1 _ 가장 많이 받은 선물

by 모너아링 2024. 6. 11.

 

조건

기록을 비교하여

1. 기록이 존재할 경우 => 더 많이 준 사람의 선물 개수 +1

2. 기록이 존재하지 않는 경우 or 주고 받은 선물의 개수가 같은 경우 => 선물 지수가 더 큰 사람의 선물 개수 +1

3. 선물 지수까지 동일한 경우 => 선물을 주고 받지 않음

 

풀이

입출력 예시에 친절하게 표가 나와있어 쉬운 문제긴 했다.

먼저 주고 받은 선물 2차원 표, 선물 지수 1차원 리스트를 선언한다.

선물 기록 리스트인 gifts를 돌며 준 사람, 받은 사람의 idx를 찾아 

1) 준 사람은 선물 지수 + 1

2) 받은 사람은 선물 지수 - 1

3) 선물 2차원 표에 기록 ([준 사람 인덱스][받은 사람 인덱스])

를 기록한다.

 

이후 2차원 표를 이중 for문으로 돌며 조건에 맞는 경우를 따져 최댓값을 찾는다.

 

def solution(friends, gifts):
    l = len(friends)
    scores = [0] * l # 선물 지수 리스트
    presents = [[0 for _ in range(l)] for _ in range(l)]  # 주고 받은 선물 2차원 리스트
    answer = 0
    
    for g in gifts:
        A, B = g.split()
        aidx = friends.index(A)
        bidx = friends.index(B)
        scores[aidx] += 1 # 선물 준 경우 선물 지수 + 1
        scores[bidx] -= 1 # 선물 받은 경우 선물 지수 -1
        presents[aidx][bidx] += 1 # 주고 받은 선물 갱신
    
    for i in range(l):
        tmp = 0
        for j in range(l):
            if i == j:
                continue
            else:
                Sub = presents[i][j] - presents[j][i]
                if Sub > 0:
                    tmp += 1
                    continue
                elif Sub == 0: 
                    # 기록 없는 경우 || 주고 받은 수가 같은 경우 => 선물 지수 비교
                    if scores[i] > scores[j]:
                        tmp += 1
        answer = max(tmp, answer)
                                        
    return answer