Programmers

폰켓몬 (HashSet)

heounto 2026. 3. 19. 16:09

오늘은 폰켓몬 문제를 풀어보겠따

 

홍박사님이 스타팅 폰켓몬을 주신다고 하신다

 

그니까 요약하면 지우가 빼액 거리면서 다양한 포켓몬을 원하는데 제시되었던 총배열의 /2가 최대치이며 가져갈 수 있는 한계라는데

 

자 해당 문제는 HashSet으로 풀어야하는데 이유는 뭐냐

 

HashMap은 키 쌍 값 각각이 필요하며 몇마리 즉 카운팅을 하여 갯수를 세어야하는데 해당 문제는 그냥 해당 배열에 그 번호가 있냐 없냐 존재 여부만 알면되어서다.

 

HashMap과 HashSet 중 어떤 걸 써야 할지 선택하는 기준은 "무엇이 필요한가" 이다.

 

HashMap → key(종류번호) : value(마리수) 쌍으로 저장, 겹쳐도 카운팅

{3:2, 1:1, 2:1} // 3번이 2마리구나

 

HashSet → 값만 저장, 중복 자동 제거, 있냐없냐만 판단

{3, 1, 2} // 몇마리인지 관심없음 있냐없냐만

 

예로들어 전에 완주하지 못한 선수는 해당 이름에 각각 인원 몇명인지 키 : 값 이였다면

현재는 그저 배열에 갯수 겹치는지 값하나의 유무만 판단하면 되기 때문이다.

 

import java.util.HashSet;

HashSet<Integer> set = new HashSet<>();

일단은 당연히 해시맵을 생성하는데 비교 값이 하나기 때문에 Integer 하나로 슈웃

 

일단 내 생각은 contains를 통하여 true false로 겹치는지 유무를 파악하고 거기에 add를 통해 해당 배열에 추가 개별적 count를 통하여 총 result 값을 뽑아낼려했다.

 

 int count = 0;
        
        for (int pocketmon : nums) {
            
            if(!set.contains(pocketmon)){
                set.add(pocketmon);
                count++;
            }

해당 nums를 뽀켓몬으로 지정하여 contains를 통하여 포함여부를 확인한다.

당연히 해당 배열에 없는 값이면 따로 add로 추가해주고 추가할때마다 count 를 높혀서

결과적으로 겹치지않는 뽀켓몬과 그 수를 알 수가 있다

ex) 3,2,1 = 3

 

자, 그럼 마지막까지 집중을 해보자

 answer = Math.min(count, nums.length/2);

분명 지문에 제시되었던 총배열의 /2가 최대치이며 가져갈 수 있는 한계

그러면 return 할려던 answer 값에 내가 구한 값의 최소값 즉, 카운트는 그대로 원본 배열의 /2 로 보여주면된다.

 

결과코드

import java.util.HashSet;

class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        
        HashSet<Integer> set = new HashSet<>();
        
        int count = 0;
        
        for (int pocketmon : nums) {
            
            if(!set.contains(pocketmon)){
                set.add(pocketmon);
                count++;
            }
        }
        answer = Math.min(count, nums.length/2);
        return answer;
    }
}

 

근데 막상 짜고 나니까 아무리 생각해도 비효율적인 것이다 nums에 포켓몬을 따로 선언해서 넣긴했는데 이걸 굳이 count만 잴려고 쓴다? 다른 방법은 없을까? 싶었다. 좀더 간단한 방법..

 

생각해보니 HashSet 자체가 중복을 제거하니까 set.size()를 쓴다면 애초에 종류 수가 바로 나온다

for (int pocketmon : nums) {
    set.add(pocketmon);  
}
answer = Math.min(set.size(), nums.length/2);

고냥 이렇게도 줄일 수 있었다는 사실