[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개월 정도 남았는데... 마무리 잘 하고 내년에는 좋은 결과가 기다리고 있으면 좋겠다.
'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 |