상세 컨텐츠

본문 제목

[프로그래머스] 258712. 가장 많이 받은 선물| 구현 | 파이썬, 소스코드, 정답

Coding Test/문제풀이

by yooputer 2024. 3. 26. 23:43

본문

https://school.programmers.co.kr/learn/courses/30/lessons/258712

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 요약

  • 선물을 주고받은 데이터를 통해 다음 달에 선물을 가장 많이 받을 사람의 선물 수를 구한다.

 

선물 예측 프로세스는 다음과 같다.

  1. 서로 선물을 주고 받았으면 더 선물을 많이 준 사람이 받는다.
  2. 서로 선물을 주고받은 적이 없거나 주고 받은 선물의 수가 동일하면 선물지수가 높은 사람이 받는다. 
    (선물 지수는 내가 준 선물 수 - 내가 받은 선물수이다.) 
  3. 만약 선물 지수가 동일하다면 두 사람은 선물을 주고받지 않는다. 

문제 조건

Input

  • friends : 이름 배열
  • gifts : "A B"형태의 문자열을 담은 배열. A는 선물을 준 사람, B는 선물을 받은 사람. A와 B는 friends의 원소 중 하나.

 

제한사항

  • 2 <= len(friends) <= 50
  • 1 <= len(gifts) <= 10000

접근 방법

  1. 누가 누구에게 선물의 몇개 줬는지를 기록한다
  2. 선물 지수를 계산한다
  3. 누가 누구에게 선물을 줄건지 계산한다.

소스코드

def solution(friends, gifts):
    numOfFriends = len(friends)
    giftMap = [[0 for j in range(numOfFriends)] for i in range(numOfFriends)]

    # gifts 파싱해서 giftMap에 저장
    # giftMap[i][j] = i가 j에게 준 선물수
    for s in gifts:
        sender, receiver = s.split(" ")
        si, ri = friends.index(sender), friends.index(receiver)
        giftMap[si][ri] = giftMap[si][ri] + 1

    # 선물지수 구하기
    선물지수 = [0 for i in range(numOfFriends)]
    for i in range(numOfFriends):
        받은선물수 = 0
        for j in range(numOfFriends):
            받은선물수 = 받은선물수 + giftMap[j][i]

        준선물수 = 0
        for j in range(numOfFriends):
            준선물수 = 준선물수 + giftMap[i][j]

        선물지수[i] = 준선물수 - 받은선물수

    # 받을 선물수 구하기
    받을선물 = [0 for i in range(numOfFriends)]
    for i in range(numOfFriends):
        for j in range(i + 1, numOfFriends):
            if giftMap[i][j] > giftMap[j][i]:
                받을선물[i] = 받을선물[i] + 1
            elif giftMap[i][j] < giftMap[j][i]:
                받을선물[j] = 받을선물[j] + 1
            else :
                if 선물지수[i] > 선물지수[j]:
                    받을선물[i] = 받을선물[i] + 1
                elif 선물지수[i] < 선물지수[j]:
                    받을선물[j] = 받을선물[j] + 1

    # 받은 선물수 중 최대값 반환
    return max(받을선물)

관련글 더보기