프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 나의 풀이
✅ 문제 정리
1) 선물 주고 받은 기록이 있다면, 두 사람 사이에 선물을 더 많이 준 사람 +1
2) 주고 받은 선물 없거나 주고 받은 횟수 같다면, 선물 지수가 높은 사람 +1
3) 선물 지수도 같다면, 선물 주고 받지 X
선물 지수 : 준 선물의 수 - 받은 선물의 수
✅ 친구의 이름을 key, 친구들의 이름을 담은 배열 friends의 index를 value로 가지는 해시맵 ➡︎ 친구의 이름에 따른 위치(index) 찾기 위함
HashMap<String, Integer> friendMap = new HashMap<>();
✅ 선물 지수 저장 위한 정수 배열 ➡︎ friendMap 의 값인 위치(index) 순서대로 저장
int[] giftIndex = new int[friends.length];
✅ 주고받은 선물 횟수를 저장한 정수 2차원 배열
int[][] giftCount = new int[friends.length][friends.length];

✅ 선물을 준 친구와 받은 친구를 저장할 문자열 배열 ➡︎ 첫번째(0) : 준 친구, 두번째(1) : 받은 친구
String[] gift = gifts[i].split(" "); // 공백 하나로 구분
✅ 친구가 다음 달에 받을 선물 수 sum
준 사람과 받은 사람이 같은 경우 : 0
두 사람 사이에 선물을 더 많이 준 사람 : +1
주고 받은 선물 없거나 주고 받은 횟수 같다면, 선물 지수가 높은 사람 : +1
✅ 가장 많은 선물의 수 ➡︎ 각 친구가 다음 달에 받을 수 중 가장 큰 수
Math.max(a, b) 두 인자 값 중 큰 값을 반환
- 나의 코드
import java.util.*;
class Solution {
public int solution(String[] friends, String[] gifts) {
int answer = 0;
HashMap<String, Integer> friendMap = new HashMap<>();
for(int i=0; i<friends.length; i++) {
friendMap.put(friends[i], i);
}
int[] giftIndex = new int[friends.length];
int[][] giftCount = new int[friends.length][friends.length];
for(int i=0; i<gifts.length; i++) {
String[] gift = gifts[i].split(" ");
// 선물 지수 저장 (증감)
giftIndex[friendMap.get(gift[0])]++;
giftIndex[friendMap.get(gift[1])]--;
// 주고받은 선물 횟수 저장
giftCount[friendMap.get(gift[0])][friendMap.get(gift[1])]++;
}
for(int i=0; i<friends.length; i++) {
int sum = 0;
for(int j=0; j<friends.length; j++) {
if(i == j) {
continue;
}
if(giftCount[i][j] > giftCount[j][i]) {
sum++;
} else if(giftCount[i][j] == giftCount[j][i] && giftIndex[i] > giftIndex[j]) {
sum++;
}
}
answer = Math.max(answer, sum);
}
return answer;
}
}