
문제설명
입출력 예시
요약
선물을 주고받은 히스토리를 비교해서 조건에 따라 다음달에 선물을 가장 많이 받을 친구가 받을 선물의 개수 구하기
풀이
문제 해석
선물을 받을 경우의 수 구하기
1) 서로 주고 받은 선물을 비교했을 때 더 많이 준 경우
2) 서로 주고 받은 선물 개수가 같다면 선물지수를 비교해서 더 큰 경우
접근 방식
1) 이차원 배열을 생성하고 서로 주고 받은 선물의 개수를 표시한다.
→ gifts 배열의 요소를 split해서 이름을 index로 바꾼 후 해당 위치에 += 1로 개수 증가
2) 전체 인원에 대해 '내가 준 선물 개수'에서 '내가 받은 선물 개수'를 빼서 선물 지수를 구한다.
→ 서로 주고 받은 선물 개수가 같은 경우 선물 지수를 비교한다.
→ 선물 지수 또한 같다면 해당 인원끼리는 선물을 주고 받지 않는다.
코드 리뷰
import java.util.*;
class Solution {
public int solution(String[] friends, String[] gifts) {
Map<String, Integer> friendsMap = new HashMap<>();
Map<String, Integer> giftsIndexMap = new HashMap<>(); // 선물 지수
Map<String, Integer> answerMap = new HashMap<>();
for(int i = 0; i < friends.length; i++) { // 각 맵을 초기화한다.
friendsMap.put(friends[i], i);
giftsIndexMap.put(friends[i], 0);
answerMap.put(friends[i], 0);
}
int[][] giftsMap = new int[friends.length][friends.length]; // 주고 받은 선물을 표시할 배열
for(int i = 0; i < gifts.length; i++) {
String[] arr = gifts[i].split(" "); // arr[0] : 준 사람, arr[1] : 받은 사람
int num1 = friendsMap.get(arr[0]); // 선물을 준 사람의 index
int num2 = friendsMap.get(arr[1]); // 선물을 받은 사람의 index
giftsMap[num1][num2] += 1; // 준 선물을 기록하고
giftsIndexMap.put(arr[0], giftsIndexMap.get(arr[0]) + 1); // 준 사람은 선물 지수 증가
giftsIndexMap.put(arr[1], giftsIndexMap.get(arr[1]) - 1); // 받은 사람은 선물 지수 감소
}
for(int i = 0; i < friends.length; i++) {
for(int j = i; j < friends.length; j++) { // 중복 확인 방지를 위해 j = i로 설정
if(i != j) { // 자기자신을 비교하는 경우 제외
if(giftsMap[i][j] > giftsMap[j][i]) // 서로 주고 받은 선물 개수 비교
answerMap.put(friends[i], answerMap.get(friends[i]) + 1);
else if(giftsMap[i][j] < giftsMap[j][i])
answerMap.put(friends[j], answerMap.get(friends[j]) + 1);
else { // 서로 주고 받은 선물 개수가 같다면
if(giftsIndexMap.get(friends[i]) > giftsIndexMap.get(friends[j])) // 선물 지수 비교
answerMap.put(friends[i], answerMap.get(friends[i]) + 1);
else if(giftsIndexMap.get(friends[i]) < giftsIndexMap.get(friends[j]))
answerMap.put(friends[j], answerMap.get(friends[j]) + 1);
}
}
}
}
return Collections.max(answerMap.values()); // 선물 개수 중 최대값 리턴
}
}
추가 자료
중복 확인 방지
'서로 주고 받은 선물'을 확인하기 때문에 두 번째 for문의 카운터 변수 j는 i부터 시작하도록 설정
+ 자기 자신을 비교하는 경우는 제외시킴
for(int i = 0; i < friends.length; i++) {
for(int j = i; j < friends.length; j++) { // 중복 확인 방지를 위해 j = i로 설정
if(i != j) { // 자기자신을 비교하는 경우 제외
(...)
}
}
}
'알고리즘 > PROGRAMMERS' 카테고리의 다른 글
메뉴 리뉴얼(Lv.2) (2) | 2024.03.19 |
---|---|
개인정보 수집 유효기간(Lv.1) (1) | 2024.03.19 |
신고 결과 받기(Lv.1) (0) | 2024.03.19 |
순위 검색(Lv.2) (0) | 2024.03.18 |
VSC 테스트 환경설정(with Java_PROGRAMMERS) (7) | 2024.03.07 |