[Python] Level 1 - 가장 많이 받은 선물

2025. 9. 9. 14:23·Coding-Test/프로그래머스
728x90
반응형

[level 1] 가장 많이 받은 선물 - 258712 

[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/258712)

 

프로그래머스

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

programmers.co.kr


💻문제 정의

이번달에 친구들이 주고받은 선물 기록을 바탕으로 다음달에 가장 많은 선물을 받는 친구의 선물 수를 return 하는 문제이다.

 

💡접근 및 설계

2차원 리스트를 생성해 친구들이 주고 받은 선물 리스트를 작성한다. 이후 해당 리스트를 통해 한 사람에 대해 준 선물의 수, 받은 선물의 수를 저장하는 리스트를 생성하고, 이를 이용해 선물 지수를 구한다.

 

최종적으로 생성된 리스트들을 통해 다음달에 가장 많은 선물을 받는 친구의 선물의 개수를 구할 수 있도록 설계하였다.

 

✏️알고리즘 풀이

mapping = {}
for i in range(len(friends)):
    mapping[friends[i]] = i

gift = [[0 for _ in range(len(friends))] for _ in range(len(friends))] # 리스트 초기화

for g in gifts:
    a, b = g.split()
    gift[mapping[a]][mapping[b]] += 1

먼저 선물을 주고 받은 기록을 저장하기 위한 2차원 리스트를 생성한다. 친구들의 이름을 리스트 인덱스로 사용할 수 없으니 인덱스 번호로 매핑하는 과정을 먼저 거친다.

 

# 준 선물 수
given_gifts = []
for i in range(len(friends)):
    given_gift = 0
    for j in gift[i]:
        given_gift += j
    given_gifts.append(given_gift)

# 받은 선물 수
taken_gifts = []
for i in range(len(friends)):
    taken_gift = 0
    for j in range(len(friends)):
        taken_gift += gift[j][i]
    taken_gifts.append(taken_gift)

score_gift = []
for i in range(len(given_gifts)):
    score_gift.append(given_gifts[i] - taken_gifts[i])

# 선물 지수
score_gift = []
for i in range(len(given_gifts)):
    score_gift.append(given_gifts[i] - taken_gifts[i])

각 친구들이 준 선물의 수와 받은 선물의 수를 각각 저장하는 리스트를 생성한다. 그리고 이를 이용해 선물 지수를 저장하는 리스트를 생성한다.

 

# 다음 달 받을 선물 수
next_month = [0] * len(friends)
for i in range(len(friends)):
    for j in range(i + 1, len(friends)):  # (i, j) 쌍만 비교
        if gift[i][j] > gift[j][i]:
            next_month[i] += 1
        elif gift[i][j] < gift[j][i]:
            next_month[j] += 1
        else: # 주고 받은 선물의 수가 같다면,
            if score_gift[i] > score_gift[j]:
                next_month[i] += 1
            elif score_gift[i] < score_gift[j]:
                next_month[j] += 1
            # 스코어 마저 같으면 아무도 선물 받지 않음

return max(next_month)

 

마지막으로 앞선 결과물들을 통해 주고 받은 선물의 수를 비교, 선물 지수를 비교하는 과정을 거쳐 최종 결과를 반환한다.

 

🗒️제출 코드

def solution(friends, gifts):
    mapping = {}
    for i in range(len(friends)):
        mapping[friends[i]] = i
    
    gift = [[0 for _ in range(len(friends))] for _ in range(len(friends))] # 리스트 초기화

    for g in gifts:
        a, b = g.split()
        gift[mapping[a]][mapping[b]] += 1
    
    # 준 선물 수
    given_gifts = []
    for i in range(len(friends)):
        given_gift = 0
        for j in gift[i]:
            given_gift += j
        given_gifts.append(given_gift)
    
    # 받은 선물 수
    taken_gifts = []
    for i in range(len(friends)):
        taken_gift = 0
        for j in range(len(friends)):
            taken_gift += gift[j][i]
        taken_gifts.append(taken_gift)
    
    # 선물 지수
    score_gift = []
    for i in range(len(given_gifts)):
        score_gift.append(given_gifts[i] - taken_gifts[i])
        
    # 다음 달 받을 선물 수
    next_month = [0] * len(friends)
    for i in range(len(friends)):
        for j in range(i + 1, len(friends)):  # (i, j) 쌍만 비교
            if gift[i][j] > gift[j][i]:
                next_month[i] += 1
            elif gift[i][j] < gift[j][i]:
                next_month[j] += 1
            else: # 주고 받은 선물의 수가 같다면,
                if score_gift[i] > score_gift[j]:
                    next_month[i] += 1
                elif score_gift[i] < score_gift[j]:
                    next_month[j] += 1
                # 스코어 마저 같으면 아무도 선물 받지 않음
        
    return max(next_month)

💭오늘의 회고

어제 (9/8) 부로 카카오 신입사원 공개채용 공고가 떳다...!

지금까지 해커톤 등의 프로젝트 때문에 바빠서 알고리즘 공부를 할 시간이 없었는데, 해커톤도 끝이 났고, 채용 공고도 올라오는 것을 보니 다시 한 번 알고리즘 공부를 할 때가 된 것 같다는 생각이 든다.

 

올해도 이제 4개월 정도 남았는데... 마무리 잘 하고 내년에는 좋은 결과가 기다리고 있으면 좋겠다.

728x90
반응형
저작자표시 (새창열림)

'Coding-Test > 프로그래머스' 카테고리의 다른 글

[SQL] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기  (0) 2026.03.02
[SQL] 그룹별 조건에 맞는 식당 목록 출력하기  (0) 2026.03.02
[SQL] 오프라인/온라인 판매 데이터 통합하기  (0) 2026.03.02
[Python] Level 2 - 큰 수 만들기  (0) 2025.09.18
[Java] Level1 - 문자열 내 p와 y의 개수  (2) 2025.01.13
'Coding-Test/프로그래머스' 카테고리의 다른 글
  • [SQL] 그룹별 조건에 맞는 식당 목록 출력하기
  • [SQL] 오프라인/온라인 판매 데이터 통합하기
  • [Python] Level 2 - 큰 수 만들기
  • [Java] Level1 - 문자열 내 p와 y의 개수
희완
희완
희완한 코딩일상
    반응형
  • 희완
    Code-Heewan
    희완
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Python
        • 가상환경
      • Algorithm
      • Coding-Test
        • 백준
        • 프로그래머스
        • 항해99
      • Data-Analysis
      • 웹 개발
        • django
      • AWS
      • 공모전
      • Mobile
  • 링크

    • Github
  • 300x250
  • hELLO· Designed By정상우.v4.10.3
희완
[Python] Level 1 - 가장 많이 받은 선물
상단으로

티스토리툴바