본문 바로가기
알고리즘/PROGRAMMERS

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

by 현대타운301 2024. 3. 18.

 


 

문제설명

 

 

 

입출력 예시

 

 

요약

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

 


 

풀이

 

문제 해석

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

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) {	// 자기자신을 비교하는 경우 제외
        	(...)
        }
    }
}

 

 

 

'알고리즘 > PROGRAMMERS' 카테고리의 다른 글

메뉴 리뉴얼(Lv.2)  (2) 2024.03.19
개인정보 수집 유효기간(Lv.1)  (1) 2024.03.19
신고 결과 받기(Lv.1)  (0) 2024.03.19
순위 검색(Lv.2)  (0) 2024.03.18
VSC 테스트 환경설정(with Java_PROGRAMMERS)  (7) 2024.03.07