PS/프로그래머스
[Python] 가장 많이 받은 선물
s_omi
2024. 11. 3. 09:48
728x90
반응형
SMALL
✏️ 문제
문제 파악
처음엔 준 사람이랑 받은 사람 구분하려고 { "muzi" : ["frodo", "frodo"] ... } 이런 식으로 딕셔너리 쓰려고 했는데
준 사람과 받은 사람, 서로 받은 선물의 수를 비교할 때 복잡해질 것 같았다.
생각해보니 friends 배열에 이름이 차례대로 들어오고 굳이 이름으로 구분 안해도 될 것 같아서 friends의 인덱스를 활용해 이차원 배열을 사용해서 서로 받은 선물의 수를 비교했다.
코드
def solution(friends, gifts):
people = [[0] * len(friends) for _ in range(len(friends))]
cnt = {} # 선물 지수
gift = [0] * len(friends) # 받는 선물 수
for f in friends:
cnt[f] = 0
for g in gifts:
give, receive = g.split()
people[friends.index(give)][friends.index(receive)] += 1
cnt[give] += 1
cnt[receive] -= 1
for i in range(len(people)):
for j in range(len(people)):
if people[i][j] > people[j][i]:
gift[i] += 1
elif people[i][j] == people[j][i]:
if cnt[friends[i]] > cnt[friends[j]]:
gift[i] += 1
return max(gift)
- 다른 사람의 풀이
def solution(friends, gifts):
f = {v: i for i, v in enumerate(friends)}
l = len(friends)
p = [0] * l
answer = [0] * l
gr = [[0] * l for i in range(l)]
for i in gifts:
a, b = i.split()
gr[f[a]][f[b]] += 1
for i in range(l):
p[i] = sum(gr[i]) - sum([k[i] for k in gr])
for i in range(l):
for j in range(l):
if gr[i][j] > gr[j][i]:
answer[i] += 1
elif gr[i][j] == gr[j][i]:
if p[i] > p[j]:
answer[i] += 1
return max(answer)
728x90
반응형
LIST