Python/프로그래머스

가장 많이 받은 선물

룰루랄라룰루랄라 2024. 3. 21. 16:37

2024 KAKAO WINTER INTERNSHIP 문제

 

선물을 직접 전하기 힘들때 카카오톡 선물하기 기능을 이용해 축하 선물을 보낼 수 있습니다. 당신의 친구들이 이번 달 까지 선물을 주고받은 기록을 바탕으로 다음 달에 누가 선물을 많이 받을지 예측하려고 합니다...

 

로 시작하는 문제이다.

 

주고 받은 것을 체크해서 선물 지수(선물 준 수 - 선물 받은 수)를 구하고, 상대와 비교하여 많이 준 쪽이 다음달에 상대에게 선물을 받는다는.. 기브앤테이크가 확실한 문제 였다..!

필요한 최종 결과값은 다음달에 가장 많은 선물을 받은 사람이 몇 개를 받느냐..!

 

아무튼..! 

우선 어떤 값을 구해야 할지 체크 해보았다.

 

서로 서로 매칭이 필요하고, 결국 선물을 받는 경우를 보면 되니까..

1. 상대 보다 많이 준 경우

2. 주고 받음이 같거나 없다면 전체 선물 지수 가 높은 경우

 

주고, 받음을 각각 담기엔 귀찮으니 주었다 +1 받았다 -1 로 체크하기로 했다..

 

최종 작성한 코드는 아래와 같다!

pinfo = {} # 주고 받은 수 넣을 딕셔너리
    for i in range(len(friends)):
        pinfo[friends[i]]={}
        for j in range(len(friends)):
            if i==j: continue
            pinfo[friends[i]][friends[j]]=0  
    
    for gift in gifts: # 주었다 +1 받았다 -1
        gn,rn = gift.split(" ")
        pinfo[gn][rn]+=1
        pinfo[rn][gn]-=1
        
    pcount=[0]*len(friends) # 선물 지수
    for fi in range(len(friends)):
        pcount[fi] = int(sum(pinfo[friends[fi]].values()))
    
    final_count = [0]*len(friends)
    for i,f1 in enumerate(pinfo):
        for item in pinfo[f1].items():
            if item[1]>0: # 현재 f1이 더 많이 줌
                final_count[i]+=1
            elif item[1]==0: # 같거나 주고 받지 않음
            	# 여기서 pcount 와 pinfo 가 가진 리스트의 인덱스가 다른것 주의
                # 그래서 j로  pcount 보면 안됨
                if pcount[i]>pcount[friends.index(item[0])]: # 선물 지수 비교
                    final_count[i]+=1
    
    answer = max(final_count)
    return answer

 

선물 지수 비교시 처음에 items 가 있는 for 문을 enumerate로 돌려 j 값을 이용해 pcount 의 상대 인덱스로 사용했다가 조금 헤맸다.. ^^

 

 

 

 

출처 : https://school.programmers.co.kr/learn/challenges

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

예상 대진  (1) 2024.03.25
구명보트  (0) 2024.03.25
카펫  (0) 2024.03.25
피보나치 수  (0) 2024.03.25
도넛과 막대 그래프  (0) 2024.03.21