본문 바로가기
알고리즘/기출

[2024 KAKAO WINTER INTERNSHIP 코테] 1. 가장 많이 받은 선물

by 모모_모 2024. 6. 19.

핵심 요약, 기억할것 맨 아래

 

🎯문제 : 가장 많이 받은 선물

⏱️ 소요시간 : 24분

 

⛳ 주안점

  • 선물지수란, 이번달 a가 모두에게 준 선물수 - 받은 선물수 
  • 선물을 주고받는 원칙
    • 선물 주고받은 기록이 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])