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

📖What I thought

  1. 필요한 정보
    • 주고받은 선물 정보 → 2차원 맵에 기록하자 각 행의사람이 다른 사람에게 선물 준 것
    • 선물 지수 = 내가 준 선물 개수 - 받은 선물 개수
  2. 위 필요한 정보를 리스트들에 담으려면 어떤 인덱스가 어떤 사람인지 파악할 수 있어야 함 → 근데 어떻게? 스치듯 friends.index(friend)도 생각해보았으나…아무래도 시간이 너무 오래 걸릴거 같아서 어디 저장을 해야겠다고 생각함
    • 딕셔너리에 key: 이름 value: 인덱스 로 저장해 인덱스 접근 O(1)에 가능하도록 만듦
  3. 다음 달 받을 수 있는 선물 수 계산
    • 내가 특정 친구랑 비교해봤을 때 선물을 더 많이 줬어 → 걔한테 받을 수 있음
    • 나랑 특정 친구랑 똑같이 주고 받았어(0개 0개도 포함) → 내 선물 지수가 더 높으면 걔한테 받을 수 있음

📖풀이

📎구현

def solution(friends, gifts):
    friends_cnt = len(friends)
    idx = {friend: i for i, friend in enumerate(friends)} # 인덱스 저장
    givetake_table = [[0 for _ in range(friends_cnt)] for _ in range(friends_cnt)] #주고받은 선물
    gift_grade = [0 for _ in range(friends_cnt)] # 선물지수
    next_month = [0 for _ in range(friends_cnt)] # 다음 달 선물
        
    # 주고받은 선물 체크 & 선물지수 계산
    for gift in gifts:
        give, take = gift.split()
        
        givetake_table[idx[give]][idx[take]] += 1
        
        gift_grade[idx[give]] += 1
        gift_grade[idx[take]] -= 1
    
    # 다음달에 받을 수 있는 선물
    for a in range(friends_cnt):
        for b in range(friends_cnt):
            if a==b:
                continue
            
            ## 다음 달에 선물을 받을 수 있는 경우
            # 1. 더 많이 선물 준 경우
            if givetake_table[a][b] > givetake_table[b][a]:
                next_month[a] += 1
            # 2. 같은 수의 선물을 주고 받은 경우엔 선물지수가 클 때
            if givetake_table[a][b] == givetake_table[b][a]:
                if gift_grade[a] > gift_grade[b]:
                    next_month[a] += 1
    
    return max(next_month)

📖What I learned️

  1. 주고받은 선물 체크할 2차원 리스트, 선물 지수를 담은 리스트를 만들었어야하는데 각 사람의 이름은 인덱스가 될 수 없으니 인덱스 정보를 처리해줬어야 함 이 때 인덱스 처리를 잘했당 ㅎㅎ 순서대로 이름을 key, 인덱스를 value로 가지는 딕셔너리를 만들어서 인덱스를 아주 잘~ 기록해줬어!!

📖관련 지식

📎Dictionary