본문 바로가기
IT

프로그래머스 포켓몬 HashSet으로 해결, HashSet의 개념까지

by MR쿠 2025. 1. 19.
728x90

오늘부터 매주 몇 개씩 프로그래머스 낮은 레벨 부터 시작해서 모든 종류의 알고리즘 문제들을 상반기 동안 풀어보려고 한다. 목표는 100문제이고, LV3 수준의 문제까지 무난하게 풀 정도의 실력까지 갖추고자 한다. 

대학교 시절 자료구조, 알고리즘 및 여러가지 코딩테스트 문제를 해결하는 수업을 들으면서 재미있었던 기억이 있다. 취업준비 할 때도 추가로 공부하기도 했는데 이후 실제 업무를 할 때는 아예 관심이 없었다.

그리고..현재.. 만8년의 개발자의 입장에서 다시 한 번 공부를 시작하게 되었다. 요즘은 코파일럿이나 GPT를 통해서 여러가지 개발에 필요한 것들을 해결하고 있어서 프로그래머스 기반의 코딩테스트 툴 자체가 불편하긴 하지만, 일단 공부니까.

 

오랜만에 보는 프로그래머스 코딩테스트 화면

 

알고리즘 문제를 풀려면 일단 자료구조를 빠삭하게 알아야 하는데, 실제 업무 할 때는 자료구조 솔직히 잘 안쓴다. 아묻따 해시맵이나 프레임워크에서 제공하는 데이터셋을 쓰는데, 이제부터라도 여러가지 자료구조를 적재적소에 쓰도록 노오력 해야겠다.

 

프로그래머스 포켓몬 문제를 간단히 요약하면 아래와 같다.

  1. nums에 포켓몬들이 숫자로 구분되어 들어있고, 중복이 있을 수 있다. ex) [ 1, 1, 2, 2, 3, 3, 3 ... ]
  2. nums의 길이/2 만큼의 포켓몬(숫자)를 고를건데, 이 때 최대로 고를 수 있는 포켓몬 가지수를 리턴하면 된다.

나이가 들어가면서 점점 문제를 잘 읽고 이해하는데 시간이 걸리는 것 같다. 하다보면 더 정확하고 빠르게 문제를 파악해서 풀이를 시작할 수 있겠지.

 

풀이방법 생각하기

일단 전체 배열 길이/2 만큼이 정답의 최대값이고, 포켓몬의 중복을 제거한 가지수가 전체 배열 길이/2 보다 큰지 작은지에 따라서 답이 결정되게끔 하면 될 것 같다.

해당문제는 이미 "Hash"라는 대메뉴 안에 들어있는 LV1 문제이기에, "HashSet"이라는 자료구조를 사용하게 되었다.

프로그래머스 코딩테스트 고득점 Kit

 

정답 소스는 아래와 같다.

import java.util.*;

class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        int answerNum = nums.length/2;
        
        HashSet<Integer> pkm = new HashSet<>();
        
        for(int i = 0; i<nums.length; i++){
            pkm.add(nums[i]);
        }
        
        if(answerNum <= pkm.size()){
            answer = answerNum;
        }
        else{
            answer = pkm.size();
        }
        
        return answer;
    }
}

 

그럼 간단히 HashSet에 대해서도 추가로 공부해보자.

이런건 구글 검색할 필요도 없이 GPT의 도움을 받으면 된다.

gpt 체고

정리해보면 다음과 같다.

  • set인 만큼 여러개의 데이터가 들어가는 Data set
  • 중복 허용을 안하고 정렬이 없으며 빠른 검색/삽입/삭제가 가능함. 복잡도는 O(1)
  • HashMap을 사용한 자료구조임

그리고 아래와 같은 함수를 사용해서 데이터셋을 관리할 수 있다.

  • add, remove, conatains, size, clear

 

내가 업무에서 개발하는 소스에서 HashMap은 자주 쓰이나, HashSet을 사용해본 적은 없다. 프레임워크에서는 사용했을 것 같긴 한데,, 만약 실제 활용을 한다면 어떤 업무에서 쓰일 지 찾아보았다.

  • 중복 제거, 빠른 검색, 유일한 값 세팅 시
  • 셋 연산이 필요할 때(교집합, 합집합 등)
  • 빠른 데이터 삽입(실시간 데이터 처리 등)

 

내가 개발하고 있는 프로젝트에서는 보통 중복에 대한 검사나 유일한 key 값 세팅 시 쿼리를 활용하는데(시퀀스 등), HashSet을 활용하는 Key값 검사 로직을 개발해 볼 수 있을 것 같다.

프로그래머스 마이페이지

프로그래머스 마이페이지를 보니 푼 문제와 총 실행 횟수 등의 통계를 볼 수 있었다. git의 그것과 상당히 비슷하다. 2025년 상반기 열심히 해서 초록색으로 가득 채워봐야겠다.

끝 :)