[풀이]

2024년 카카오 겨울인턴십 코테 문제이다.

문제의 조건을 잘 읽고 , 조건에 맞게 구현하면 되는 단순 구현 문제이다.

 

모두 map을 사용해서 각각의 데이터들을 관리했다.

먼저 선물을 주고받은 내용을 기록하기 위해 2차원 map인 gift_record라는 변수를 선언했다.

key 값에 선물을 준 사람의 이름을 넣고, 2번째 map에는 누구에서 몇개의 선물을 줬는지에 대한 데이터를 저장한다.

첫번째 예시를 기준으로 보면 아래와 같이 gift_record가 존재하게 된다.

{'muzi', {'frodo',2}}

{'ryan', {'muzi',3}}

{'frodo', {{'muzi',1}, {'ryan',1}}}

{'neo', {'muzi',1}}

그리고 각 사람들의 선물 지수를 기록하기 위해 gift_score 라는 1차원 map을 선언했다.

key 값을 사람의 이름이 되고 , value는 선물 지수 값이 된다.

 

선물 지수는 (준 선물의 개수 - 받은 선물의 개수) 이므로 

사실상 선물을 줄 때는 현재 선물 지수에 +1을 해주고

선물을 줄 때는 현재 선물 지수에 -1을 해주면 된다. 

따라서 gift_record, gift_score 의 값을 동시에 채워줬다.

 

Java에서 Map 인터페이스의 getOrDefault 메서드를 사용해 map의 value 값을 할당해줬다.

특정 키를 조회할 때, 해당 키가 존재하면 해당 키 값을 / 존재하지 않을 경우 기본값(default value)을 반환해준다.

 

마지막으로 gift_record를 기반으로 다음 달에 받을 선물을 계산했다.

1. 서로 선물을 주고 받은 경우 선물을 적게 준 사람이 더 많이 준 사람에게 담달에 선물을 하나 주고 

2. 하나도 주고 받지 않았거나 , 주고 받은 개수가 같을 경우에는 선물 지수를 기반으로 담달 선물을 준다

2-1 선물 지수가 작은 사람이 큰 사람에게 담달에 선물 1개를 주면 된다.

 

여기서는 선물을 받는 사람을 기준으로만 계산을 했다. 

따라서 위의 조건을 만족하여 선물을 받는 사람일 경우 gift_cnt에서 받는 사람에 해당하는 value에 1을 더해줬다.

 

마지막으로 Collections을 사용해 gift_cnt의 value중 최대값을 구하였다.

Collections는 java.util 패키지에 포함된 유틸리티 클래스로, 컬렉션(Collection) 객체를 쉽게 조작하고 관리할 수 있도록 sort, search, min, max와 같이 다양한 정적 메서드를 제공한다.

 

[코드]

import java.util.Map;
import java.util.HashMap;
import java.util.Collections;

class Solution {
    
    static int[][] gift_cnt = new int [50][];


    public int solution(String[] friends, String[] gifts) {
        int answer = 0;
        //선물 기록 관리
        Map<String, Map<String, Integer>> gift_record= new HashMap<>();
        // 선물 지수
        Map<String, Integer> gift_score = new HashMap<>();
        // 받을 선물 개수
        Map<String, Integer> gift_cnt = new HashMap<>();
    


        for(String friend : friends) { 
            gift_record.put(friend, new HashMap<>());
            gift_score.put(friend,0);
            gift_cnt.put(friend,0);
        }
            
        for (String gift : gifts) {
            String person[] = gift.split(" ");
            String from = person[0];
            String to = person[1];

            gift_record.get(from).put(to, gift_record.get(from).getOrDefault(to, 0) + 1);
            gift_score.put(from, gift_score.get(from) + 1);
            gift_score.put(to, gift_score.get(to) - 1);
        }

        for(String from : friends) { 
            for(String to : friends) { 
                if(!from.equals(to)) {
                    int from_cnt = gift_record.get(from).getOrDefault(to, 0); //from이 to에게 준 선물의 개수
                    int to_cnt = gift_record.get(to).getOrDefault(from, 0); //to가 from에게 준 선물의 개수
                    if(from_cnt > to_cnt) {
                        gift_cnt.put(from, gift_cnt.get(from) + 1);
                    } else if (from_cnt == to_cnt && gift_score.get(from) > gift_score.get(to)) {
                            gift_cnt.put(from, gift_cnt.get(from) + 1);
                    } 
                }
            }
        }


        return Collections.max(gift_cnt.values());
    }
}

 

[문제]

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

+ Recent posts