[풀이]
2024년 카카오 겨울인턴십 코테 문제이다.
문제의 조건을 잘 읽고 , 조건에 맞게 구현하면 되는 단순 구현 문제이다.
모두 map을 사용해서 각각의 데이터들을 관리했다.
먼저 선물을 주고받은 내용을 기록하기 위해 2차원 map인 gift_record라는 변수를 선언했다.
key 값에 선물을 준 사람의 이름을 넣고, 2번째 map에는 누구에서 몇개의 선물을 줬는지에 대한 데이터를 저장한다.
첫번째 예시를 기준으로 보면 아래와 같이 gift_record가 존재하게 된다.
{'muzi', {'frodo',2}}
{'ryan', {'muzi',3}}
{'frodo', {{'muzi',1}, {'ryan',1}}}
{'neo', {'muzi',1}}
그리고 각 사람들의 선물 지수를 기록하기 위해 gift_score 라는 1차원 map을 선언했다.
key 값을 사람의 이름이 되고 , value는 선물 지수 값이 된다.
선물 지수는 (준 선물의 개수 - 받은 선물의 개수) 이므로
사실상 선물을 줄 때는 현재 선물 지수에 +1을 해주고
선물을 줄 때는 현재 선물 지수에 -1을 해주면 된다.
따라서 gift_record, gift_score 의 값을 동시에 채워줬다.
Java에서 Map 인터페이스의 getOrDefault 메서드를 사용해 map의 value 값을 할당해줬다.
특정 키를 조회할 때, 해당 키가 존재하면 해당 키 값을 / 존재하지 않을 경우 기본값(default value)을 반환해준다.
마지막으로 gift_record를 기반으로 다음 달에 받을 선물을 계산했다.
1. 서로 선물을 주고 받은 경우 선물을 적게 준 사람이 더 많이 준 사람에게 담달에 선물을 하나 주고
2. 하나도 주고 받지 않았거나 , 주고 받은 개수가 같을 경우에는 선물 지수를 기반으로 담달 선물을 준다
2-1 선물 지수가 작은 사람이 큰 사람에게 담달에 선물 1개를 주면 된다.
여기서는 선물을 받는 사람을 기준으로만 계산을 했다.
따라서 위의 조건을 만족하여 선물을 받는 사람일 경우 gift_cnt에서 받는 사람에 해당하는 value에 1을 더해줬다.
마지막으로 Collections을 사용해 gift_cnt의 value중 최대값을 구하였다.
Collections는 java.util 패키지에 포함된 유틸리티 클래스로, 컬렉션(Collection) 객체를 쉽게 조작하고 관리할 수 있도록 sort, search, min, max와 같이 다양한 정적 메서드를 제공한다.
[코드]
import java.util.Map;
import java.util.HashMap;
import java.util.Collections;
class Solution {
static int[][] gift_cnt = new int [50][];
public int solution(String[] friends, String[] gifts) {
int answer = 0;
//선물 기록 관리
Map<String, Map<String, Integer>> gift_record= new HashMap<>();
// 선물 지수
Map<String, Integer> gift_score = new HashMap<>();
// 받을 선물 개수
Map<String, Integer> gift_cnt = new HashMap<>();
for(String friend : friends) {
gift_record.put(friend, new HashMap<>());
gift_score.put(friend,0);
gift_cnt.put(friend,0);
}
for (String gift : gifts) {
String person[] = gift.split(" ");
String from = person[0];
String to = person[1];
gift_record.get(from).put(to, gift_record.get(from).getOrDefault(to, 0) + 1);
gift_score.put(from, gift_score.get(from) + 1);
gift_score.put(to, gift_score.get(to) - 1);
}
for(String from : friends) {
for(String to : friends) {
if(!from.equals(to)) {
int from_cnt = gift_record.get(from).getOrDefault(to, 0); //from이 to에게 준 선물의 개수
int to_cnt = gift_record.get(to).getOrDefault(from, 0); //to가 from에게 준 선물의 개수
if(from_cnt > to_cnt) {
gift_cnt.put(from, gift_cnt.get(from) + 1);
} else if (from_cnt == to_cnt && gift_score.get(from) > gift_score.get(to)) {
gift_cnt.put(from, gift_cnt.get(from) + 1);
}
}
}
}
return Collections.max(gift_cnt.values());
}
}
[문제]
https://school.programmers.co.kr/learn/courses/30/lessons/258712
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 이모티콘 할인 행사 (JAVA) (0) | 2024.12.09 |
---|---|
[프로그래머스] 도넛과 막대 그래프 (JAVA) (0) | 2024.12.09 |
[프로그래머스] PCCP 기출문제 1번 / 동영상 재생기 (JAVA) (0) | 2024.12.08 |
[프로그래머스] 하노이의 탑 (JAVA) (0) | 2024.12.08 |
[프로그래머스] 뉴스 클러스터링 (C++) (0) | 2022.09.06 |