기본적인 틀은 friends 를 행 열로 하는 2차원 배열을 하나 생성 후 각 행이 열에게 선물을 준 회수를 저장하고
선물지수를 저장하는 1차원 배열 한 개와
다음 달 선물을 받을 수치를 저장할 배열 한 개를 만들어 그 중 가장 큰 수를 반환하는 형태로 구성했다.
public int solution(String[] friends, String[] gifts) {
int answer = 0;
int[][] giveList = new int[friends.length][friends.length];//주고받은 선물 수
int[] giveAndTake = new int[friends.length]; //선물지수
int[] nextMonth = new int[friends.length]; //다음달에 받을 선물
for(int i = 0 ; i < friends.length; ++i){ //friends 행
for(int j = 0 ; j< gifts.length; ++j){ //friends 열
String[] gt = gifts[j].split(" "); //gifts가 "준사람 받은사람"으로 구성되어있기 때문에 띄어쓰기를 기준으로 나눠주고 배열에 저장한다.
if(gt[0].equals(friends[i])){ //준사람이 현재 탐색중인 friends와 동일하면
giveAndTake[i]++; //선물지수를 +1
int a = Arrays.asList(friends).indexOf(gt[1]); //받은사람의 text를 탐색하여 friends의 몇번째 index인지 저장
giveList[i][a]++; //현재 탐색중인 friends행, 선물을 준 friends 열의 값에 +1
}else if(gt[1].equals(friends[i])){ //현재 탐색중인 friends가 선물을 받았다면
giveAndTake[i]--; //선물지수를 -1
}
}
}
for(int i = 0 ; i < friends.length; ++i){ //friends 행
for(int j = 0 ; j < friends.length; ++j){ //friedns 열
if(giveList[i] != giveList[j]){ //본인이 본인에게 줄 수 없으므로 필터링을 함
if(giveList[i][j] > giveList[j][i]){//행에 해당하는 friends가 열에 해당하는 friends에게 더 많이 줬다면
nextMonth[i]++; //다음달 받을 선물을 +1
}else if(giveList[i][j] == giveList[j][i]){ //서로 주고받은 선물의 수가 동일할 경우
//행에 해당하는 friends의 선물지수가 높으면 다음달 받을 선물+1 아니면 +0
nextMonth[i] = giveAndTake[i] > giveAndTake[j] ? nextMonth[i] + 1 : nextMonth[i] + 0;
}
}
}
}
Arrays.sort(nextMonth);
answer = nextMonth[nextMonth.length - 1];
return answer;
}
'개?발 > 프로그래머스' 카테고리의 다른 글
달리기 경주 (1) | 2024.04.26 |
---|---|
명예의 전당 (0) | 2024.04.25 |
바탕화면 정리(Java) (0) | 2024.04.24 |
두 원 사이의 정수 쌍 C# (0) | 2024.04.24 |
프로그래머스 짝지어 제거하기 (0) | 2024.04.24 |