본문 바로가기
Beakjoon&프로그래머스/Java

[프로그래머스/Java] 가장 많이 받은 선물

by 현장 2026. 3. 24.

-Code

import java.util.*;

class Solution {
    static class GiftInfo {
        int give = 0, receive = 0;

        public void giveGift() {
            this.give++;
        }

        public void receiveGift() {
            this.receive++;
        }

        public int getVal() {
            return give - receive;
        }
    }

    public int solution(String[] friends, String[] gifts) {
        // 선물 주고 받은 횟수 정보 맵
        Map<String, GiftInfo> giftInfoMap = new HashMap<>();
        // 사람마다 받은 사람과 선물 갯수를 저장하는 맵
        Map<String, Map<String, Integer>> giftMap = new HashMap<>();
        for (String friend : friends) {
            giftInfoMap.put(friend, new GiftInfo());
            giftMap.put(friend, new HashMap<>());
        }
        // 서로 주고 받은 선물 받기
        for (String gift : gifts) {
            StringTokenizer st = new StringTokenizer(gift);
            String giver = st.nextToken();
            String receiver = st.nextToken();
            // 각 사람의 선물 지수 계산을 위한 맵 셋팅
            giftInfoMap.get(giver).giveGift();
            giftInfoMap.get(receiver).receiveGift();
            // 선물을 받은 사람 및 보낸사람 업데이트
            Map<String, Integer> giverMap = giftMap.get(receiver);
            int cnt = giverMap.getOrDefault(giver, 0) + 1;
            giverMap.put(giver, cnt);
            giftMap.put(receiver, giverMap);
        }
        int maxRecieve = 0;
        for (String friend : friends) {
            int nextRecieve = 0;
            // 선물을 준 사람들 검사
            for (String giver : friends) {
                int reciverCnt = giftMap.get(friend).getOrDefault(giver, 0);
                int giverCnt = giftMap.get(giver).getOrDefault(friend, 0);
                // 내가 기부한 사람보다 많이 선물을 줬을 때와
                // 각 준 사람과 받은사람의 선물이 같은 경우 선물 지수가 내가 더 클때 다음 선물 +1
                if (reciverCnt < giverCnt ||
                        (reciverCnt == giverCnt &&
                                giftInfoMap.get(friend).getVal() > giftInfoMap.get(giver).getVal())
                ) {
                    nextRecieve++;
                }
            }
            maxRecieve = Math.max(maxRecieve, nextRecieve);
        }
        return maxRecieve;
    }
}

Map을로 짜다 보니 받은 사람과 받은 사람의 개수를 2중 Map으로 작성해서 복잡해져서 잘못한 부분을 수정하는데 오래 걸렸습니다. 또한 만들고 보니 2중 배열로도 가능할 것 같다는 생각도 들었습니다.