Algorithm/Programmers
[Programmers] 가장 많이 받은 선물
Jyuni
2024. 1. 25. 11:41
문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/258712
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
friends[]:친구 이름, gifts[]:선물 기록이 주어졌을 때 다음달에 가장 많은 선물을 받는 친구의 선물 개수 return
1. 이번달에 선물을 더 많이 준사람이 다음달에 선물을 받는다.
2. 이번달에 선물을 주고받은 개수가 같거나 하나도 주고받지 않는다면 선물지수가 낮은 사람이 높은 사람에게 선물을 준다.
선물지수 : 모든 친구들에게 준 선물 개수 - 모든 친구들에게 받은 선물 개수
3. 선물지수가 같으면 다음달에 선물을 주고받지 않는다.
HashMap을 사용하여 친구들을 0번부터 index로 저장
2차원 배열에 주고받은 선물 내역 저장
1차원 배열에 각 친구별 선물지수 저장
위의 조건에 따라 선물 내역을 저장한 배열을 돌면서 answer에 다음달에 가장 많이 받는 선물의 개수 max값 저장 후 return
코드
import java.util.*;
class Solution {
public int solution(String[] friends, String[] gifts) {
// init
int answer = 0;
Map<String, Integer> friendsMap = new HashMap<>();
int len = friends.length;
int[][] giftList = new int[len][len];
int[] giftScore = new int[friends.length];
for(int i=0; i<len; i++) {
friendsMap.put(friends[i], i);
}
// 주고 받은 선물 리스트
for(String gift : gifts) {
StringTokenizer st = new StringTokenizer(gift);
int friend_1 = friendsMap.get(st.nextToken());
int friend_2 = friendsMap.get(st.nextToken());
giftList[friend_1][friend_2]++;
}
// 선물 지수
for(int i=0; i<len; i++) {
for(int j=0; j<len; j++) {
giftScore[i] += giftList[i][j];
giftScore[j] -= giftList[i][j];
}
}
// 다음달 선물 가장 많이 받는 친구 선물 개수
for(int i=0; i<len; i++) {
int nextMonthGift = 0;
for(int j=0; j<len; j++) {
if(i==j) continue;
if(giftList[i][j] > giftList[j][i]) {
nextMonthGift++;
} else if(giftList[i][j] == giftList[j][i]) {
if(giftScore[i] > giftScore[j]) {
nextMonthGift++;
}
}
}
answer = Math.max(answer, nextMonthGift);
}
return answer;
}
}