문제 출처 : 폰켓몬
문제를 잘 읽어보면 N마리의 폰켓몬 중 N/2 마리
를 가져갈 수 있다는 문장이 있다. 그 말은 중복없이 폰켓몬 종류가 다양하다고 해도, 결국 N/2 마리를 가져갈 수 밖에 없다는 이야기이다.
최대 가져갈 수 있는 폰켓몬의 수 : N/2
입출력으로 주어진 예시들을 머릿속으로 직접 시뮬레이션을 한다면 아래와 같다.
[3, 1, 2, 3] -> 최대 2마리, 서로 다른 종류는 3마리 (3, 1, 2)
[3, 3, 3, 2, 2, 4] -> 최대 3마리, 서로 다른 종류는 3마리 (3, 2, 4)
[3, 3, 3, 2, 2, 2] -> 최대 3마리, 서로 다른 종류는 2마리 (3, 2)
//이 예시는 이해를 위해 만든 예시
[3, 3, 3, 3, 2, 2, 2, 2] -> 최대 4마리, 서로 다른 종류는 2마리 (3, 2)
이러한 관찰을 통해 아래와 같은 순서로 코드를 작성할 수 있다.
그렇다면 중복된 종류들을 어떤 방법으로 제거할 수 있을까?
친절하게도 문제의 종류가 '해시'라는 것을 눈치챘다면 자바의 HashSet을 이용해서 풀 수 있을 것이다.
Set은 중복없이 원소들을 보관할 수 있는 Collection 자료형이다.
이를 바탕으로 제출 코드를 작성해보면 아래와 같이 작성할 수 있다.
import java.util.*;
class Solution {
public int solution(int[] nums) {
int answer = nums.length / 2;
HashSet<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
return set.size() > answer ? answer : set.size();
}
}