PS/프로그래머스

[Python] 가장 많이 받은 선물

s_omi 2024. 11. 3. 09:48

✏️ 문제

 

문제 파악

처음엔 준 사람이랑 받은 사람 구분하려고 { "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)

 

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

[Python] 성격 유형 검사하기  (0) 2024.11.03
[Python] 신고 결과 받기  (0) 2024.11.02
[Python] 1번 / 동영상 재생기  (0) 2024.11.02
[Python] 개인정보 수집 유효기간  (1) 2024.11.02
[Python] 10번 / 공원  (0) 2024.11.02