https://school.programmers.co.kr/learn/courses/30/lessons/258712
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
가장 많이 받은 선물이라는 문제 Java로 풀이하겠습니다.
이 문제는 선물을 주고받은 기록을 토대로 다음 달에 누가 선물을 많이 받을지 예측하는 문제입니다.
규칙은 다음과 같습니다.
- 두 사람이 선물을 주고받은 기록이 있다면, 이번 달까지 두 사람 사이에 더 많은 선물을 준 사람이 다음 달에 선물을 하나 받습니다.
- 두 사람이 선물을 주고받은 기록이 없거나 주고받은 선물의 수가 같다면, 선물 지수가 더 큰 사람이 선물을 받습니다.
- 선물 지수는 이번 달까지 자신이 친구들에게 준 선물의 수에서 받은 선물의 수를 뺀 값입니다.
즉, 누가 누구에게 선물을 더 많이 줬는지와 선물 지수를 비교하여 다음 달에 누가 선물을 받을지를 결정합니다.
따라서 주어진 선물 주고받은 기록과 선물 지수를 이용하여 각 친구가 다음 달에 받을 선물 개수를 계산하고, 가장 많은 선물을 받을 친구의 선물 개수를 반환하면 됩니다.
저는 다음과 같이 풀이하였습니다.
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'는 각 친구의 선물 지수를 저장하는 배열입니다.
- 각 친구의 이름과 인덱스를 매핑하여 'friendIndexMap'을 생성합니다.
- 그런 다음, 선물 주고받은 기록과 선물 지수를 업데이트합니다.
각 선물의 주는 사람과 받는 사람의 인덱스를 찾고 해당 인덱스에 따라 'giftIndex'를 증가 또는 감소시키고, 'giftRecord'에 해당하는 값도 업데이트합니다. - 마지막으로, 각 친구가 받을 선물 개수를 계산합니다.
이를 위해 중첩된 루프를 사용하여 각 친구에 대해 선물을 준 친구들의 선물 기록과 선물 지수를 비교하여 해당 친구가 받을 선물 개수를 결정합니다. - 최종적으로 가장 많은 선물을 받을 친구의 선물 개수를 반환합니다.
이견이 있으시다면 자유롭게 댓글 남겨주세요.
'Algorithm > CodingTest' 카테고리의 다른 글
[Baekjoon] 1094번 막대기 (java) (2) | 2024.01.14 |
---|---|
[Programmers] 과일 장수(Java) (0) | 2024.01.12 |
[Programmers] PCCE 기출문제 10번 / 데이터 분석 (0) | 2024.01.07 |
[Programmers] PCCE 기출문제 9번 / 이웃한 칸 (1) | 2024.01.02 |
[Baekjoon] 1173번 운동 (Java) (2) | 2023.11.12 |