
-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중 배열로도 가능할 것 같다는 생각도 들었습니다.
'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글
| [백준/Java] 6069번 Switching Lights (0) | 2026.03.25 |
|---|---|
| [백준/Java] 35290번 SUAPC 2025 Summer (0) | 2026.03.25 |
| [백준/Java] 10655번 마라톤 1 (0) | 2026.03.24 |
| [프로그래머스/Java] [PCCP 기출문제] 1번 / 동영상 재생기 (0) | 2026.03.23 |
| [프로그래머스/Java] 유연근무제 (0) | 2026.03.23 |