알고리즘/PROGRAMMERS

가장 많이 받은 선물(Lv.1)

현대타운301 2024. 3. 18. 22:21

 


 

문제설명

 

 

 

입출력 예시

 

 

요약

선물을 주고받은 히스토리를 비교해서 조건에 따라 다음달에 선물을 가장 많이 받을 친구가 받을 선물의 개수 구하기

 


 

풀이

 

문제 해석

선물을 받을 경우의 수 구하기

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문의 카운터 변수 ji부터 시작하도록 설정

+ 자기 자신을 비교하는 경우는 제외시킴

for(int i = 0; i < friends.length; i++) {
    for(int j = i; j < friends.length; j++) {	// 중복 확인 방지를 위해 j = i로 설정
        if(i != j) {	// 자기자신을 비교하는 경우 제외
        	(...)
        }
    }
}