문제
https://school.programmers.co.kr/learn/courses/30/lessons/258712#
문제 설명
선물을 직접 전하기 힘들 때 카카오톡 선물하기 기능을 이용해 축하 선물을 보낼 수 있습니다. 당신의 친구들이 이번 달까지 선물을 주고받은 기록을 바탕으로 다음 달에 누가 선물을 많이 받을지 예측하려고 합니다.
- 두 사람이 선물을 주고받은 기록이 있다면, 이번 달까지 두 사람 사이에 더 많은 선물을 준 사람이 다음 달에 선물을 하나 받습니다.
- 두 사람이 선물을 주고받은 기록이 하나도 없거나 주고받은 수가 같다면, 선물 지수가 더 큰 사람이 선물 지수가 더 작은 사람에게 선물을 하나 받습니다.
위에서 설명한 규칙대로 다음 달에 선물을 주고받을 때, 당신은 선물을 가장 많이 받을 친구가 받을 선물의 수를 알고 싶습니다.
문제 풀이
이 문제는 파이썬을 조금 더 잘 알았더라면 잘 풀었을지도 모르겠네.. 일단 리스트 원툴이니 리스트를 활용하였고, x->y로 준다고 가정했을 때 2차원 리스트를 생성해서 x->y에게 몇번 주었는지 저장했다. 이와 동시에 이렇게 저장한다면, gift[x]의 합은 x가 준 횟수가 되고 gift[*][x]의 합은 누군가에게 받은 횟수가 된다.
그러면 문제가 굉장히 쉬워진다.
그런데 딕셔너리를 활용했다면 더 나았지 않았을까 싶기도 하다.
어떤 대단한 사람의 코드를 봤는데, 나는 이름을 index로 접근하여 한번 탐색하고 들어갔는데,
f = {v: i for i, v in enumerate(friends)}
이런 식으로 이름을 키로 해서 인덱스를 가지는 딕셔너리로 만들어버렸다. 흠냐 대단하군...
어떤 사람은 2*n + n**2로 푸셨는데 뭐 나랑 그냥저냥 저거빼곤 비슷한 것 같아서 요정도 하겠다. 딕셔너리 쓰는걸 좀 익히면 사기 될 것 같은 느낌이 스멀스멀 드네.
최종 코드
def solution(friends, gifts):
answer = 0
gift_count = [ [0]*len(friends) for _ in range(len(friends))]
# gift_count[x][y]: x -> y에게 주다.
# 곧, x의 전체 합을 구하면 줬던 횟수를 모두 계산할 수 있음ㅇㅇ 받았던 횟수는 gift_count[][x]로 조회 가능!
for gift in gifts:
a,b = gift.split()
gift_count[friends.index(a)][friends.index(b)] += 1
for i in range(len(friends),0,-1):
gift = 0
for j in range(len(friends),0,-1):
if(friends[i-1]==friends[j-1]):
continue
if gift_count[i-1][j-1] - gift_count[j-1][i-1] > 0:
gift += 1
elif gift_count[i-1][j-1] == gift_count[j-1][i-1]:
if calculate_rate(gift_count, i-1) > calculate_rate(gift_count, j-1):
gift += 1
if gift > answer:
answer = gift
return answer
def calculate_rate(gift_count, x):
plus = sum(gift_count[x])
minus = 0
for i in range(len(gift_count)):
minus += gift_count[i][x]
return plus - minus
'Algorithm > 문제풀이' 카테고리의 다른 글
[백준] 3015번: 오아시스 재결합 (0) | 2024.08.27 |
---|---|
[백준] 6549번:히스토그램에서 가장 큰 직사각형 (2) | 2024.08.26 |
[프로그래머스] Lv2. 요격 시스템 (0) | 2024.07.26 |
[백준] 12851 숨바꼭질 2(C++) (0) | 2024.04.30 |
[1260번] DFS와 BFS (feat: 동적할당 오버헤드 및 고정크기배열) (0) | 2024.04.06 |