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

gayoung·2024년 2월 20일
0

알고리즘

목록 보기
47/50

1. 문제

문제 설명

제한사항

입출력 예시

입출력 예 설명


2. 풀이 과정

내가 생각한 진행 과정

  1. 선물을 주고받은 경우를 구한다.

    • 이때, muzi = 0, ryan = 1, frodo = 2, neo = 3으로 표시(dictionary로)

    • board판을 그리기

      muziryanfrodoneo
      muzi0020
      ryan3000
      frodo1100
      neo1000
  1. board판을 이용해서 선물지수 구하기(gift_cnt)

    • 내가 다른사람에게 선물을 준 갯수는 가로의 합 (ex. muzi => 0+0+2+0)
    • 내가 다른사람에게 선물 받은 갯수는 세로에서 내 위치의 합 (ex. muzi => 0+3+1+1)
    • 선물지수 = 선물 준 갯수 - 선물 받은 갯수 (ex. muzi => 2-5 = -3)
  2. 선물받은 갯수를 temp리스트에 넣기

    • 선물 교환 내역이 있으면 더 많이 선물한사람이 다음달에 선물을 받음
    • 선물 교환 내역이 없거나, 주고받은 수가 같으면 gift_cnt에서 선물지수를 가지고와서 선물지수가 큰 사람에게 선물을 줌

최종 코드

def solution(friends, gifts):
    friends_dict = {}
    for i in range(len(friends)):
        friends_dict[friends[i]] = i

    board = [[0] * len(friends) for _ in range(len(friends))]
    for gift in gifts:
        a, b = gift.split()
        board[friends_dict[a]][friends_dict[b]] += 1
    # print(board)
    
    gift_cnt = [0] * len(friends)
    for i in range(len(friends)):
        cnt = sum(board[i])
        for j in range(len(friends)):
            cnt -= board[j][i]
        gift_cnt[i] = cnt  
    # print(gift_cnt)
    
    temp = [0] * len(friends)
    for x in range(len(friends)-1):
        for y in range(x+1,len(friends)):
            if board[x][y] > board[y][x]:
                temp[x] += 1
            elif board[x][y] < board[y][x]:
                temp[y] += 1
            else:
                if gift_cnt[x] > gift_cnt[y]:
                    temp[x] += 1
                elif gift_cnt[x] < gift_cnt[y]:
                    temp[y] += 1
    # print(temp)
    
    return max(temp)

0개의 댓글

관련 채용 정보