알고리즘/해시

프로그래머스 - 포켓몬(Java)

연향동큰손 2025. 1. 4. 14:02

 

 

이 문제를 풀때 가장 핵심이 되었던 알고리즘은 해시맵에서 키가 중복이 되면 안된다는 것이었다.

 

만약 키를 중복해서 해시맵에 삽입하면 키가 중복되어 추가되는 것이 아닌 value값만 갱신된다.

 

문제 이해

 

우선 포켓몬의 종류 갯수를 알아야한다.

 

이를 알기 위해서는 중복된 값을 제거하여 각 포켓몬의 수를 알아내면 되는데

 

나는 이 과정을 해시를 이용하여 해결하였다.

 

 

문제 해결

 

 

for(int i=0; i<nums.length; i++){
           map.put(nums[i],nums[i]);
}

 

 

이러면 중복이 제거된 상태의 배열을 해시 맵에서 얻을 수 있다.

 

 

여기서 해시맵의 크기는 중복이 제거된 포켓몬의 수를 뜻한다.

 

 if(map.size()==(nums.length)/2){
            answer=map.size();
        }
        else if(map.size()<(nums.length)/2){
            answer=map.size();
        }
        else{
            answer=nums.length/2;
}

 

최대 고를 수 있는 포켓몬의 수 == nums배열 사이즈/2 이므로 

 

해시맵의 사이즈가 (nums배열의 사이즈/2)와 같은 경우 ==> 모든 포켓몬의 종류를 선택 가능하므로 answer=map.size()

 

해시맵의 사이즈가 (nums배열의 사이즈/2) 보다 작은경우 ==> 이 경우에도 모든 포켓몬의 종류를 선택 가능하므로 answer=map.size()

 

해시맵의 사이즈가 (nums배열의 사이즈/2)보다 큰경우 ==> 이 경우에는  nums배열 사이즈/2 만큼의 포켓몬만 선택 가능하므로 answer를 num.length/2로 설정

 

 

 

 

 


나의 다른 풀이

 

import java.util.*;

class Solution {
    public int solution(int[] nums) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int a : nums){
            map.put(a,a);
        }
        
        int s = map.size();
        int half = nums.length/2;
        if(s>=half){
            return half;
        }
        else {
            return s;
        }
    }
}