본문 바로가기

알고리즘/프로그래머스

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

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 접근 

 

우선 조건을 먼저 정리해 보았다.

 

1. 선물을 주고받은 기록이 있다면 => 주고받은 크기를 비교해 하나를 더 받거나 준다.

2. 선물을 주고받은 기록이 없다면 or 같다면 => 선물 지수를 비교 => 이마저 같으면 주고받지 않음

 

그리고 어떻게 구현할지 고민해 보았다.

주어진 예시들을 설명하기 위해  마련된 테이블이 2개

1. 두 사람이 주고받은 선물들의 개수를 각각 저장할 2차원 배열 

2. 선물 지수를 계산해 담을 1차원 배열 

 

코드
def solution(friends, gifts):
    
    name_table = {}
    for i, friend in enumerate(friends):    # key-value(이름-숫자) 
        name_table[friend] = i
        
    # num_gifts[i][j]: i가 j에게 준 선물의 개수
    num_gifts = [[0] * len(friends) for _ in range(len(friends))]
    
    for gift in gifts:
        giver, receiver = gift.split()
        num_gifts[name_table[giver]][name_table[receiver]] += 1
    
    # gifts_index: 선물 지수 
    gifts_index = [0] * len(friends)
    
    transposed_num_gifts = list(zip(*num_gifts))
    
    for friend in friends:
        i = name_table[friend]
        gifts_index[i] = sum(num_gifts[i]) - sum(transposed_num_gifts[i])
    
    #최대 선물 저장할 변수 
    max_gifts = 0
    
    for i, receiver in enumerate(friends):
        gifts = 0
        for j, giver in enumerate(friends):
            if i == j:
                continue
            
            if num_gifts[i][j] > num_gifts[j][i]:
                gifts += 1
            elif num_gifts[i][j] == num_gifts[j][i]:
                if gifts_index[i] > gifts_index[j]:
                    gifts += 1
        max_gifts = max(max_gifts, gifts)
    

    return max_gifts