본문 바로가기

Algorithm/Implementation

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

반응형

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

구현 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

1. 정답 변수 answer

 

2. 선물을 준 사람명, 준 대상의 목록을 각각 key와 value로 지정할 변수 gave_gift_dict

 

3. 선물을 받은 사람명, 받은 대상의 목록을  각각 key와 value로 지정할 변수 take_gift_dict

 

4. 사람명과 선물 지수를 각각 key, value로 저장할 gift_index

 

5. 다음달에 받는 사람과 받는 선물 수를 각각 key value로 get_gift_graph

 

를 선언해주고 중복으로 선물받지 않기위해 checked를 선언 후 friends의 원소를 순회하며 적절히 초기화해줍니다.

 

📔 풀이과정

1. gifts의 원소를 순회하며 다음을 진행합니다.

 

  1-1. 각 원소별 공백으로 구분해 split한 정보를 splited_g에 저장합니다.

 

  1-2. 첫 번째 원소는 준 사람명, 두 번째는 준 대상명이므로 준 사람과 받은 대상을 각각 gave_gift_dict, take_gift_dict에 저장해줍니다.

 

2. friends에 대해 순회하며 특정 사람이 준 선물개수 - 받은 선물개수를 수행해 선물지수를 저장합니다.

 

3. friends에 대해 2차원 for loop를 수행하며 다음을 진행합니다.

 

  3-1. f1, f2의 checked여부를 검사해 False라면 continue해줍니다.

 

  3-2. f1이 f2에게 준 선물 개수와 f1이 f2에게 받은 선물 개수를 구해 각각 give_count, take_count에 저장해줍니다.      3-3. f1이 f2에게 준 선물 개수가 받은 개수보다 많다면 f1이 선물을 받아줍니다. 아니라면 선물 교환한 적이 없거나 동일한 선물을 교환했으므로 선물지수를 비교해 f1이 더 크다면 f1이 선물을 받아줍니다.

 

4. get_gift_graph를 순회하며 가장 많이 받은 선물 개수를 구해 answer에 저장합니다.    

📔 정답 출력 | 반환

answer를 반환합니다.


📕 Code

📔 Python3

def solution(friends, gifts):
    answer = 0
    gave_gift_dict = {}
    take_gift_dict = {}
    gift_index = {}
    get_gift_graph = {}
    checked = {}
    
    for f in friends:
        gave_gift_dict[f] = []
        take_gift_dict[f] = []
        gift_index[f] = 0
        get_gift_graph[f] = 0
        
    for f1 in friends:
        checked[f1] = {}
        for f2 in friends:
            checked[f1][f2] = False
            
    for g in gifts:
        splited_g = g.split()
        gave_gift_dict[splited_g[0]].append(splited_g[1])
        take_gift_dict[splited_g[1]].append(splited_g[0])
        
    for f in friends:
        gift_index[f] = len(gave_gift_dict[f]) - len(take_gift_dict[f])
    
    for f1_name in friends:
        for f2_name in friends:
            if checked[f1_name][f2_name]:
                continue
            checked[f1_name][f2_name] = True
            #f1이 f2에게 선물준 개수
            give_count = gave_gift_dict[f1_name].count(f2_name)
            #f2가 f1에게 선물준 개수
            take_count = take_gift_dict[f1_name].count(f2_name)
            # f1이 f2에게 선물준 개수가 더 많으면
            if give_count > take_count:
                get_gift_graph[f1_name] += 1
            elif give_count == take_count:
                if gift_index[f1_name] > gift_index[f2_name]:
                    get_gift_graph[f1_name] += 1
                
    for _, count in get_gift_graph.items():
        answer = max(answer,count)
    
    return answer

*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.