핵심 요약, 기억할것 맨 아래
🎯문제 : 가장 많이 받은 선물
⏱️ 소요시간 : 24분
⛳ 주안점
- 선물지수란, 이번달 a가 모두에게 준 선물수 - 받은 선물수
- 선물을 주고받는 원칙
- 선물 주고받은 기록이 a,b간 있다면
- 더 많이 준 사람이 하나 받음
- 같다면, 선물지수 높은 사람이 하나 받음
- 선물지수도 같다면, 선물을 주고받지 않음
- 선물 주고받은 기록이 없다면, 선물지수 높은 사람이 하나 받는다
- 선물 주고받은 기록이 a,b간 있다면
- 구해야 할 것 : 가장 선물 많이 받아야 하는 친구의 선물
🧑💻 코딩 및 자료구조
- 선물 주고받은 history 기록할 2차원 배열 board
- i가 j에게 n개의 선물 주었다면, board[i][j] == n
- 선물지수 기록할 1차원 배열 statusList
- gifts 배열의 입력은 "a b"의 형태로 구성되어 있고, board에 기록하기 위해 index를 기록할 필요가 있다.
- a,b = gifts[i].split() 로 파싱하고,
- friends dictionary로 인덱스를 생성한다.
def solution(friends, gifts):
fLen = len(friends)
gLen = len(gifts)
statusList = [[0,0,0] for _ in range(fLen)]
board = [[0 for _ in range(fLen)] for _ in range(fLen)]
#indexing
fd = {}
for i in range(fLen):
fd[friends[i]] = i
#board
for i in range(gLen):
a,b = gifts[i].split()
an = fd[a]
bn = fd[b]
board[an][bn] += 1
statusList[an][0] += 1
statusList[bn][1] += 1
statusList[an][2] += 1
statusList[bn][2] -= 1
ansList = [0 for _ in range(fLen)]
for i in range(fLen):
currentSum = 0
for j in range(i,fLen):
if i == j: continue
if board[j][i] < board[i][j]:
ansList[i] += 1
elif board[j][i] > board[i][j]:
ansList[j] += 1
else:
if statusList[i][2] > statusList[j][2]:
ansList[i] += 1
elif statusList[i][2] < statusList[j][2]:
ansList[j] += 1
return max(ansList)
기억할 것
- dictionary 생성
//좋고 간편한 코드
f = {v: i for i, v in enumerate(friends)}
//레거시 코드
fd = {}
for i in range(fLen):
fd[friends[i]] = i
- 2차원 배열에서, i번째 row와 i번째 행의 총합으로 선물 지수를 구하는 방식
#good code
for i in range(l):
p[i] = sum(gr[i]) - sum([k[i] for k in gr])