본문 바로가기
공부/알고리즘

2024 KAKAO WINTER INTERNSHIP > 가장 많이 받은 선물

by shining park 2024. 8. 1.
https://school.programmers.co.kr/learn/courses/30/lessons/258712
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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;
    }
}
 

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

공원 산책  (0) 2024.10.30
카펫  (0) 2024.08.03
같은 숫자는 싫어  (0) 2024.08.01
폰켓몬  (0) 2024.08.01
2022 KAKAO TECH INTERNSHIP > 두 큐 합 같게 만들기  (5) 2023.12.06