Coolog 🖥️

/

[Coding Test] 가장 많이 받은 선물 ⭐


🐳2024 KAKAO WINTER INTERNSHIP 가장 많이 받은 선물 ⭐ 코딩 테스트 문제를 풀고 정리한 글입니다 🐳

💫 문제 설명

매개변수

  • friends : 친구들의 이름을 담은 1차원 문자열 배열
    • 2 ≤ friends의 길이 = 친구들의 수 ≤ 50
      • friends의 원소는 친구의 이름을 의미하는 알파벳 소문자로 이루어진 길이가 10 이하인 문자열입니다.
      • 이름이 같은 친구는 없습니다.
  • gifts : 이번 달까지 친구들이 주고받은 선물 기록을 담은 1차원 문자열 배열
    • 1 ≤ gifts의 길이 ≤ 10,000
      • gifts의 원소는 "A B"형태의 문자열입니다. A는 선물을 준 친구의 이름을 B는 선물을 받은 친구의 이름을 의미하며 공백 하나로 구분됩니다.
      • A와 B는 friends의 원소이며 A와 B가 같은 이름인 경우는 존재하지 않습니다.

규칙

  • 두 사람이 선물을 주고받은 기록이 있다면, 이번 달까지 두 사람 사이에 더 많은 선물을 준 사람이 다음 달에 선물을 하나 받습니다.
    • 예를 들어 A가 B에게 선물을 5번 줬고, B가 A에게 선물을 3번 줬다면 다음 달엔 A가 B에게 선물을 하나 받습니다.
  • 두 사람이 선물을 주고받은 기록이 하나도 없거나 주고받은 수가 같다면, 선물 지수가 더 큰 사람이 선물 지수가 더 작은 사람에게 선물을 하나 받습니다.
    • 선물 지수는 이번 달까지 자신이 친구들에게 준 선물의 수에서 받은 선물의 수를 뺀 값입니다.
    • 예를 들어 A가 친구들에게 준 선물이 3개고 받은 선물이 10개라면 A의 선물 지수는 -7입니다. B가 친구들에게 준 선물이 3개고 받은 선물이 2개라면 B의 선물 지수는 1입니다. 만약 A와 B가 선물을 주고받은 적이 없거나 정확히 같은 수로 선물을 주고받았다면, 다음 달엔 B가 A에게 선물을 하나 받습니다.
    • 만약 두 사람의 선물 지수도 같다면 다음 달에 선물을 주고받지 않습니다.

→ 다음달에 가장 많은 선물을 받는 친구가 받을 선물의 수를 return 하도록 solution 함수를 완성


입출력 예

friends gifts result
[“muzi”, “ryan”, “frodo”, “neo”] [“muzi frodo”, “muzi frodo”, “ryan muzi”, “ryan muzi”, “ryan muzi”, “frodo muzi”, “frodo ryan”, “neo muzi”] 2
[“joy”, “brad”, “alessandro”, “conan”, “david”] [“alessandro brad”, “alessandro joy”, “alessandro conan”, “david alessandro”, “alessandro david”] 4
[“a”, “b”, “c”] [“a b”, “b a”, “c a”, “a c”, “a c”, “c a”] 0

입출력 예 #1

↓준 사람 / 받은 사람→ muzi ryan frodo neo
muzi 0 2 0
ryan 3 0 0
frodo 1 1 0
neo 1 0 0
이름 준 선물 받은 선물 선물 지수
muzi 2 5 -3
ryan 3 1 2
frodo 2 2 0
neo 1 0 1
  • muzi는 선물을 더 많이 줬던 frodo에게서 선물을 하나 받습니다.
  • ryan은 선물을 더 많이 줬던 muzi에게서 선물을 하나 받고, 선물을 주고받지 않았던 neo보다 선물 지수가 커 선물을 하나 받습니다.
  • frodo는 선물을 더 많이 줬던 ryan에게 선물을 하나 받습니다.
  • neo는 선물을 더 많이 줬던 muzi에게서 선물을 하나 받고, 선물을 주고받지 않았던 frodo보다 선물 지수가 커 선물을 하나 받습니다.
  • 다음달에 가장 선물을 많이 받는 사람은 ryan과 neo이고 2개의 선물을 받습니다. 따라서 2를 return 해야 합니다.

💫 코드

def solution(friends, gifts):
    #선물지수
    arr = [[friend,0,0] for friend in friends]
    #주고받은선물
    arr2 = [[0] * len(friends) for i in range(len(friends))]
    cnt = 0
    answer = 0

    for gift in gifts:
        a, b = gift.split()
        for i in range(len(arr)):
            if a == arr[i][0]:
                arr[i][1] += 1
                a_i = i
                cnt +=1
            if b == arr[i][0]:
                arr[i][2] += 1
                b_i = i
                cnt  += 1
            if cnt >= 2:
                cnt = 0
                break
        arr2[a_i][b_i] += 1

    for i in range(len(friends)):
        cnt = 0
        for j in range(len(friends)):
            if i != j:
                if arr2[i][j] > arr2[j][i]:
                    cnt += 1
                elif arr2[i][j] == arr2[j][i]:
                    if arr[i][1]-arr[i][2] > arr[j][1]-arr[j][2]:
                        cnt += 1
        if cnt > answer:
            answer = cnt
    return answer

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

최근 게시물