알고리즘 문제 풀기

[프로그래머스 1845] 폰켓몬 (java)

Solu- 2021. 4. 22. 15:42

출처

나의 코드

import java.util.ArrayList;

class Solution {
    public int solution(int[] nums) {
        int answer = nums.length / 2;
        ArrayList<Integer> li = new ArrayList<>();

        for (int i : nums) {
            if (li.isEmpty()) {
                li.add(i);
            }
            else {
                if (li.indexOf(i) == -1) {
                    li.add(i);
                }


            }

            if (li.size() == answer) {
                return answer;
            }
        }

        return li.size();
    }
}

결국 중복을 제거하고, 가장 많은 종류를 고를 수 있는 게 무엇인가 알아내는 것이다.
최대 N / 2 까지 고를 수 있는데, 그 내에서 가장 많은 종류를 선택할 수 있는 방안을 찾는다.

이 코드는 ArrayList<Integer>를 이용해서 중복 값을 제외한 리스트를 만들었다. 이 리스트의 길이 (=중복하지 않은 원소 갯수)가 답이 되는데, 이 때 최대값은 N / 2 이기 때문에 N/2에 N / 2에 도달할 경우 int[] nums 탐색을 종료한다.

모범 답안

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();
    }
}

중복되지 않는 원소를 넣기 위해 HashSet을 사용했다. HashSet은 중복 요소를 자동으로 제거해주기 때문에, 중복 체크를 할 필요 없이 코드가 훨씬 간편하게 마무리가 된다.

문제에 따라 적절한 자료 형태를 사용할 수 있도록 자료형에 대한 공부가 필요하겠다.