본문 바로가기
알고리즘/프로그래머스

프로그래머스 Lv1 가장 많이 받은 선물 (python)

by 개발하는 호랑이 2024. 2. 10.

가장 많이 받은 선물

 

 

풀이

문제보고 어,,,, 하다가 문제대로 풀면 되겠지하고, 규칙을 정하고 풀었다.
1. 두 사람이 주고 받은 게 있을 때, 선물 수가 다른 경우
2. 두 사람이 주고 받은 게 있을 때, 선물 수가 같은 경우
3. 두 사람이 주고 받은 게 없을 때, 선물 수가 다른 경우
4. 두 사람이 주고 받은 게 없을 때, 선물 수가 같은 경우

이를 생각하고 아래 처럼 풀어봤다.
for문과 if 문이 많아 오래 걸린 듯하다.

# A, B
# A가 B에게 5번, B가 A에게 3번 이면, A가 B에게 선물주기
# 2사람이 주고 받은 기록이 없으면 또는 같은 횟수로 서로에게 줬다면, 선물을 더 많이 줬던 사람이 받음
# 선물지수도 같으면 서로 안주고받음.

# 1. 두사람이 서로 주고받은게 있고, 두사람 사이의 선물 수가 다른 경우
# 2. 두사람이 서로 주고받은게 있고, 두사람 사이의 선물 수가 같은 경우
# 3. 두사람이 서로 주고받은게 없고, 선물지수가 다른 경우
# 4. 두사람이 서로 주고받은게 없고, 선물지수가 같은 경우

def solution(friends, gifts):
    answer = 0
    gifts =  [list(map(str, gifts[i].split())) for i in range(len(gifts))]
    gifts_give = {}
    gifts_recieve = {}
    gifts_next_recieve = {}
    for friend in friends:
        gifts_give[friend] = 0
        gifts_recieve[friend] = 0
        gifts_next_recieve[friend] = 0
    for i in range(len(gifts)):
        if gifts_give.get(gifts[i][0]) is not None:
            gifts_give[gifts[i][0]] += 1
        if gifts_recieve.get(gifts[i][1]) is not None:
            gifts_recieve[gifts[i][1]] += 1
    for i in range(len(friends)-1):
        for j in range(i + 1, len(friends)):
            # 두 사람이 선물을 주고 받은 기록이 없다면 선물지수
            if ([friends[i], friends[j]] not in gifts) and ([friends[j], friends[i]] not in gifts):
                a_gift_index = gifts_give[friends[i]] - gifts_recieve[friends[i]]
                b_gift_index = gifts_give[friends[j]] - gifts_recieve[friends[j]]
                # 선물지수가 큰 사람이 선물 받음
                if a_gift_index > b_gift_index:
                    gifts_next_recieve[friends[i]] += 1
                elif a_gift_index < b_gift_index:
                    gifts_next_recieve[friends[j]] += 1
                # 선물지수가 같으면 넘어감
                else:
                    pass
                
            # 두 사람이 선물을 주고 받은 기록이 있다면 상호 확인
            else:
                # 서로 선물을 준 횟수를 담기
                if [friends[i], friends[j]] in gifts:
                    a = gifts.count([friends[i], friends[j]])
                else:
                    a = 0
                if [friends[j], friends[i]] in gifts:
                    b = gifts.count([friends[j], friends[i]])
                else:
                    b = 0
                if a > b:
                    gifts_next_recieve[friends[i]] += 1
                elif a < b:
                    gifts_next_recieve[friends[j]] += 1
                # 상호 주고받은 횟수가 같으면
                elif a == b:
                    # 선물지수 확인
                    a_gift_index = gifts_give[friends[i]] - gifts_recieve[friends[i]]
                    b_gift_index = gifts_give[friends[j]] - gifts_recieve[friends[j]]
                    if a_gift_index > b_gift_index:
                        gifts_next_recieve[friends[i]] += 1
                    elif a_gift_index < b_gift_index:
                        gifts_next_recieve[friends[j]] += 1
                    else:
                        pass
    
    return max(gifts_next_recieve.values())


너무 오래 걸렸따.

다른 사람 풀이

확실히 실력 차이가 난다.
왜이리 똑똑한 사람들이 많은지 모르겠다 부럽군.....

우선 f를 친구와 인덱스를 같이 하는 dictionary를 만들어서, 이를 활용한 리스트를 사용한 방법이다.

내가 여러번 for문을 써서 dictionary에 넣은 것과 달리
p라는 리스트에 [0,0]의 형식으로 집어넣음으로 계산하여 좀 더 빠른 입력을 했다.

천잰가.... 나란 녀석은 감히 쳐다도보지못하겠군 흑흑흑

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)

빌런의 코딩

엄준식이라니;;;;
당황스럽다...

def solution(엄, 준식):
    엄준식=int(not [])
    어떻게사람이름이={어엄:[엄준식-엄준식] for 어엄 in 엄}
    식 = len(엄)
    엄준식화이팅 = [엄준식-엄준식]*식
    for 어엄준식 in 준식:

        어엄준식 = 어엄준식.split()
        어떻게사람이름이[어엄준식[엄준식-엄준식]].append(어엄준식[엄준식])
        어떻게사람이름이[어엄준식[엄준식-엄준식]][엄준식-엄준식]+=엄준식
        어떻게사람이름이[어엄준식[엄준식]][엄준식-엄준식]-=엄준식

    for 준 in range(식):
        for 주운 in range(준+엄준식,식):
            if 어떻게사람이름이[엄[준]].count(엄[주운])==어떻게사람이름이[엄[주운]].count(엄[준]):
                if 어떻게사람이름이[엄[준]][엄준식-엄준식]>어떻게사람이름이[엄[주운]][엄준식-엄준식]:
                    엄준식화이팅[준]+=엄준식
                elif 어떻게사람이름이[엄[준]][엄준식-엄준식]<어떻게사람이름이[엄[주운]][엄준식-엄준식]:
                    엄준식화이팅[주운]+=엄준식
            elif 어떻게사람이름이[엄[준]].count(엄[주운])>어떻게사람이름이[엄[주운]].count(엄[준]):
                엄준식화이팅[준]+=엄준식
            else:
                엄준식화이팅[주운]+=엄준식
    return max(엄준식화이팅)