JAVA/코딩테스트

프로그래머스 레벨 1 - 코딩테스트 고득점kit 해쉬 : 폰켓몬[자바]

진짠 2024. 6. 12. 10:01
728x90

문제

난이도 : 레벨1

문제 :

  • 폰켓몬을 가져갈 수 있는 최대 개수는 총 폰켓몬 / 2
  • 같은 종류의 폰켓몬은 가져갈 수 없음

제한사항 :

  • nums 배열에 폰켓몬의 종류가 1차원 배열로 담겨 있음.
  • 1 <= nums <= 10,000 이며 항상 짝수
  • 폰켓몬의 종류는 자연수 1~200,000

애초에 코딩테스트 공부를 거의 안하기도 했고 오랜만에 다시 공부하는 코딩테스트라 어떻게 풀어야 하는지 전혀 감이 잡히지 않았습니다.
배열을 순회하면서 원소들끼리 비교해서 다르다면 count++ 하는 방법을 생각했으나 포기했습니다.
(다른 사람의 풀이를 보니 sort를 통해 정렬한 후에 제가 생각한 방법대로 한 것을 보긴 했습니다. sort함수를 알고는 있었지만 거기까지 연결짓지 못했습니다.)

결국 풀이를 통해 HashSet와 중복 제거라는 키워드를 찾았고 그것을 토대로 문제를 풀 수 있었습니다.

import java.util.*;

class Solution {
    public int solution(int[] nums) {
        HashSet<Integer> pocketmon = new HashSet<Integer>();
        int maxValue = nums.length / 2;
        
        for(int num : nums) {
            pocketmon.add(num);
        }
        
        if(maxValue < pocketmon.size()) {
            return maxValue;
        } else {
            return pocketmon.size();
        }
    }
}

HashSet 생성 후 배열을 담았고 중복을 제거해주었습니다.
그리고 중복을 제거한 수가 최대값인 maxValue보다 클 경우에는 maxValue를 리턴하였고 작을 경우엔 중복을 제거한 수를 리턴해 주었습니다.

HashSet은 중요한 키워드인 만큼 자주 쓰일 법한 메소드를 정리해 보았습니다.

  • remove(value) - 원하는 값을 삭제
  • clear() - 전체삭제
  • size() - 크기 구하기
  • Iterator - HashSet의 값을 하나씩 값을 꺼내고 싶을때
    ex) Iterator iter = set.iterator();
    while(iter.hasNext()) {
    // 값을 출력
    }

다른 사람의 풀이

저의 지식으로 충분히 생각해 볼 법한 키워드였지만 생각하지 못한 것은 HashMap의 Key값이 고유하다는 점을 이용하여 Key 값에 폰켓몬의 종류 값을 넣어 중복을 제거하는 것이었습니다.

HashMap<Integer, Integer> map = new HashMap<Integer,Integer>();

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

    ...

이런 식으로 값을 넣으면 중복 또한 제거될 것입니다.

중복을 제거하거나 배열에서 특정 조건에 대한 값을 추출하고 싶을 때 해시 함수를 이용하면 좋겠다는 감을 잡을 수 있는 문제였습니다.

728x90