본문 바로가기

개발지/코테

[프로그래머스] 코테연습 - 폰켓몬(lv.1)

- 내 방법 풀이

  • 간단한 수학 문제였다.
  • 설명이 길지만 요점은 박사님 연구실에 있는 폰켓몬 중 N / 2 마리를 데려갈 때 가장 많이 데려갈 수 있는 종류의 수를 구하면 되는 문제였다. HashMap에 키가 중복되지 않는 점을 이용해, 폰켓몬 번호를 key로 value를 넣었다.
  • HashMap의 사이즈가 곧 폰켓몬의 종류 수이므로, 종류수보다 N / 2가 작다면 해쉬 사이즈 리턴.
    종류수가 (N / 2)보다 크다면 N / 2 를 리턴하도록 했다.
import java.util.*;

class Solution {
    public int solution(int[] nums) {
        int answer = 0;
        // 종류를 검사하여 해쉬에 넣기. 키값은 중복 안되므로, 해쉬의 사이즈 == 폰켓몬 종류 갯수
        // (폰켓몬 종류 갯수 < N / 2) 라면 해쉬 사이즈 리턴
        // (폰켓몬 종류 갯수 >= N / 2) 라면 N / 2 리턴.
        HashMap<Integer, Integer> phonket = new HashMap<>();
        for (int i : nums) {
            phonket.put(i, 1);
        }
        if (phonket.size() < nums.length / 2) return phonket.size();
        else return nums.length / 2;
    }
}

- 다른 사람 방법 풀이 (HashSet 사용)

  • HashSet을 사용하여 풀었다.
  • 나는 HashMap이 익숙하여, HashMap으로 풀었지만 HashSet이 더 용이한 풀이었다.
  • HashMap과 HashSet의 차이는 value의 지정 유무다. HashMap은 value를 직접 입력하지만, HashSet은 자바에서 임의지정하여 저장한다. 둘 다 key의 중복을 허용하지 않기 때문에 Hash를 통해 폰켓몬의 종류 수를 알아내는 것은 결과적으로 같다.
import java.util.HashSet;

class Solution {
    public int solution(int[] nums) {

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

            for(int i =0; i<nums.length;i++) {
                hs.add(nums[i]);
            }

            if(hs.size()>nums.length/2)
                return nums.length/2;

            return hs.size();
    }
}