개발 창고/Algorithm

[프로그래머스] 가장 많이 받은 선물 - JAVA

로이제로 2024. 1. 7. 15:16
반응형


문제

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

 

프로그래머스

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

programmers.co.kr

문제 내용은 지적 재산 보호 차원에서 가져오지 않고 풀이만 공유드리도록 하겠습니다.


풀이

 제 풀이가 무조건적으로 맞는 것도 최적의 답변도 아니지만, 이런 풀이도 있다는 차원에서 작성해 보며, 좀 더 나은 방법이 있다면 이야기해 주셔도 도움 될 것 같습니다.

import java.util.HashMap;

class Solution {
    public int solution(String[] friends, String[] gifts) {
        // 1. 기본 데이터 생성
        HashMap<String, HashMap<String, Integer>> map = new HashMap<String, HashMap<String, Integer>>();
        for(String from:friends){
            HashMap<String, Integer> friend = new HashMap<String, Integer>();
            for(String to:friends){
                friend.put(to, 0);
            }
            friend.put("tot", 0);
            map.put(from, friend);
        }
        
        // 2. 선물 횟수 / 선물 지수 데이터 생성
        for(String gift:gifts){
            String from = gift.split(" ")[0];
            String to = gift.split(" ")[1];
            
            // 선물 준 사람 데이터 세팅 (대상 / 지수)
            map.get(from).put(to, map.get(from).get(to) + 1);
            map.get(from).put("tot", map.get(from).get("tot") + 1);
            
            // 받은 사람 데이터 세팅 (대상 / 지수)
            map.get(to).put(from, map.get(to).get(from) - 1);
            map.get(to).put("tot", map.get(to).get("tot") - 1);
        }
        
        // 3. 결과 도출
        int answer = 0;
        String answerNm = "";
        for(String from:friends){
            int gift = 0;   // 다음달에 받을 총 개수
            for(String to:friends){
                // 본인이 아닌 경우
                if(!from.equals(to)){
                    int send = map.get(from).get(to);
                    int recv = map.get(to).get(from);

                    if(send > recv){
                        // 준 횟수가 많으면 +1
                        gift++;
                    }else if(send == recv && map.get(from).get("tot") > map.get(to).get("tot")){
                        // 준 횟수가 같고 선물지수가 높으면 +1
                        gift++;
                    }else{
                        // 그 외 처리 안함
                    }
                }
            }
            
            // 현재 까지의 최대 수령자 보다 값이 높으면 최대 수령자 갱신
            if(answer < gift){
                answer = gift;
                answerNm = from;
            }
        }
        
        // System.out.println(answerNm + " > " + answer);
        return answer;
    }
}

코드 실행 결과
제출 결과

반응형