알고리즘 문제풀이/프로그래머스

[프로그래머스] 카카오 2024 가장 많이 받은 선물

lovelyunsh 2024. 5. 28. 21:10

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/258712

 

프로그래머스

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

programmers.co.kr

2. 접근방법

단순 구현 문제

 

우선 편하게 풀이하기 위해 친구의 이름을 모두 HashMap에 index와 매칭 시켜준다.

 

이전 선물 정보를 토대로

1. 2차원 배열로 각 친구가 누구에게 선물을 몇개씩 주었는지 저장.

2. 선물지수 정보 저장.

 

이중 for문으로 몇 개의 선물을 받을지 구하기.

모든 인원 중 가장 많이 받은 선물의 갯수 return

3. 자바 코드

import java.util.*;

class Solution {
    public int solution(String[] friends, String[] gifts) {
        int answer = 0;
        Map<String, Integer> indexMap = new HashMap<>();
        for (int i = 0; i < friends.length; i++) {
            indexMap.put(friends[i], i);
        }

        int[][] giftArray = new int[friends.length][friends.length];
        int[] giftNum = new int[friends.length];
        for (String gift : gifts) {
            String[] giftSplit = gift.split(" ");
            int giveIndex = indexMap.get(giftSplit[0]);
            int receiveIndex = indexMap.get(giftSplit[1]);
            giftNum[giveIndex]++;
            giftNum[receiveIndex]--;
            giftArray[giveIndex][receiveIndex]++;
        }

        int nowGift[] = new int[friends.length];
        for (int i = 0; i < friends.length; i++) {

            for (int j = 0; j < friends.length; j++) {
                if (i == j) continue;
                if (giftArray[i][j] > giftArray[j][i]) {
                    nowGift[i]++;
                } else if (giftArray[i][j] == giftArray[j][i] && giftNum[i] > giftNum[j]) {
                    nowGift[i]++;
                }
            }
        }
        
        return Arrays.stream(nowGift).max().getAsInt();
    }
}

4. 마치며

카카오 1번 문제 인데 난이도가 조금 올라간 느낌.