Algorithm/CodingTest

[Programmers] 2024 KAKAO WINTER INTERNSHIP 가장 많이 받은 선물 (Java)

누구세연 2024. 4. 2. 22:55

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

 

프로그래머스

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

programmers.co.kr

 

가장 많이 받은 선물이라는 문제 Java로 풀이하겠습니다.

 

이 문제는 선물을 주고받은 기록을 토대로 다음 달에 누가 선물을 많이 받을지 예측하는 문제입니다.

규칙은 다음과 같습니다.

  1. 두 사람이 선물을 주고받은 기록이 있다면, 이번 달까지 두 사람 사이에 더 많은 선물을 준 사람이 다음 달에 선물을 하나 받습니다.
  2. 두 사람이 선물을 주고받은 기록이 없거나 주고받은 선물의 수가 같다면, 선물 지수가 더 큰 사람이 선물을 받습니다.
  3. 선물 지수는 이번 달까지 자신이 친구들에게 준 선물의 수에서 받은 선물의 수를 뺀 값입니다.

즉, 누가 누구에게 선물을 더 많이 줬는지와 선물 지수를 비교하여 다음 달에 누가 선물을 받을지를 결정합니다.

따라서 주어진 선물 주고받은 기록과 선물 지수를 이용하여 각 친구가 다음 달에 받을 선물 개수를 계산하고, 가장 많은 선물을 받을 친구의 선물 개수를 반환하면 됩니다.

 

저는 다음과 같이 풀이하였습니다.

import java.util.*;

class Solution {
    public int solution(String[] friends, String[] gifts) {
        Map<String, Integer> friendIndexMap = new HashMap<>();
        int[][] giftRecord = new int[friends.length][friends.length];
        int[] giftIndex = new int[friends.length];

        // 친구의 이름과 인덱스를 매핑한 맵 생성
        for (int i = 0; i < friends.length; i++) {
            friendIndexMap.put(friends[i], i);
        }

        // 선물 주고 받은 기록 및 선물 지수 업데이트
        for (String gift : gifts) {
            String[] splitGift = gift.split(" ");
            String giver = splitGift[0];
            String receiver = splitGift[1];
            int giverIndex = friendIndexMap.get(giver);
            int receiverIndex = friendIndexMap.get(receiver);
            giftIndex[giverIndex]++;
            giftIndex[receiverIndex]--;
            giftRecord[giverIndex][receiverIndex]++;
        }

        // 각 친구가 받을 선물 개수 계산
        int maxGifts = 0;
        for (int i = 0; i < friends.length; i++) {
            int cnt = 0;
            for (int j = 0; j < friends.length; j++) {
                if (i != j) {
                    if (giftRecord[i][j] > giftRecord[j][i] || (giftRecord[i][j] == giftRecord[j][i] && giftIndex[i] > giftIndex[j])) {
                        cnt++;
                    }
                }
            }
            maxGifts = Math.max(maxGifts, cnt);
        }
        return maxGifts;
    }
}

 

'friendIndexMap'은 친구의 이름을 해당 친구의 인덱스로 매핑하는 HashMap입니다.

'giftRecord'는 선물 주고받은 기록을 저장하는 2차원 배열입니다.

'giftIndex'는 각 친구의 선물 지수를 저장하는 배열입니다.

  1. 각 친구의 이름과 인덱스를 매핑하여 'friendIndexMap'을 생성합니다.
  2. 그런 다음, 선물 주고받은 기록과 선물 지수를 업데이트합니다.
    각 선물의 주는 사람과 받는 사람의 인덱스를 찾고 해당 인덱스에 따라 'giftIndex'를 증가 또는 감소시키고, 'giftRecord'에 해당하는 값도 업데이트합니다.
  3. 마지막으로, 각 친구가 받을 선물 개수를 계산합니다.
    이를 위해 중첩된 루프를 사용하여 각 친구에 대해 선물을 준 친구들의 선물 기록과 선물 지수를 비교하여 해당 친구가 받을 선물 개수를 결정합니다.
  4. 최종적으로 가장 많은 선물을 받을 친구의 선물 개수를 반환합니다.

 

 

이견이 있으시다면 자유롭게 댓글 남겨주세요.