매일 Algorithm

신재원·2024년 1월 9일
0

Algorithm

목록 보기
241/243

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

아래는 내가 작성한 코드이며, LV 1 문제치곤 어려웠다. 풀면서 핵심으로 느꼈던 부분을 번호순으로 작성 해보겠습니다.

  1. Map 객체를 3개를 정의해야함

    • 선물을 많이 받을사람,
    • 선물 지수 저장,
    • 선물 지수와 선물 갯수 저장 (Map 객체의 Map 객체를 정의)
  2. 입력되는 gifts 변수에 대한 선물지수를 계산해서 저장

  3. 선물을 많이 받을 사람에 대한 조건 떠올리기

    • 서로 간의 선물을 더 많이 줬는지 확인
    • 선물을 주고 받았는지 여부 확인
    • 주고 받지 않았더라면, 선물 지수를 비교
  4. Collections 객체를 사용하여 최대값 구하기

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

class Solution {
    public int solution(String[] friends, String[] gifts) {
        
        // 선물을 받은 갯수
        Map<String, Integer> presentStore = new HashMap<>();
        
        // 선물 지수
        Map<String, Integer> presentLog = new HashMap<>();
        
        // 선물 지수와 선물 갯수 비교
        Map<String, Map<String, Integer>> record = new HashMap<>();
        
        // 1. Map 객체 초기화
        for(int i = 0; i < friends.length; i++){
            presentStore.put(friends[i], 0);
            presentLog.put(friends[i], 0);
            record.put(friends[i], new HashMap<>());
        }
        
        
        for(String gift : gifts){
            String[] names = gift.split(" ");
            String give = names[0];
            String recive = names[1];
            
            // 2. 선물지수 계산해서 객체에 저장
            presentLog.put(give, presentLog.get(give) + 1);
            presentLog.put(recive, presentLog.get(recive) - 1);
            
            // 3. 주고받은 선물 저장
            // 선물을 준 사람의 value (여기선 Map 객체)에 저장한다.
            record.get(give).put(recive, 
                                 record.get(give).getOrDefault(recive, 0) + 1);
        }
        
        
        // 4. 주고받은 선물의 대한 현황을 찾는다.
        for(String friend : friends){
            for(String target : friends){
                if(friend.equals(target)){
                    continue;
                }
                
                // 5. 주고받은 선물의 갯수를 찾는다. 
                // - 더 많이 줬는지 확인
                // - 선물을 주고 받지 않았는지 확인
                // - 주고받지 않았더라면, 선물 지수가 큰지 확인
                if(record.get(friend).getOrDefault(target, 0) > 
                   record.get(target).getOrDefault(friend, 0) || 
                  record.get(friend).getOrDefault(target, 0).equals(
                      record.get(target).getOrDefault(friend, 0)) &&
                   presentLog.get(friend) > presentLog.get(target)) 
                {
                    presentStore.put(friend, presentStore.get(friend) + 1);
                }
            }
        }
             
        // 6. presentStore 객체의 최대값 (value) 을 찾는다
        return Collections.max(presentStore.values());
    }
}

0개의 댓글