17분 소요


2/N
종류에 따른 번호 부여
가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return
처음엔 이중반복문을 사용해 배열 원소 비교를 통해 구현하려 했다. 이전 원소와 같은 원소를 만날 시, 종류 수++, 다음 원소 비교
하지만, 다음 원소를 비교하는 것이 막상 떠올리지 않고, O(n^2)의 안좋은 시간복잡도로 다른 방법을 생각
정리하면서 생각해보니, 같은 원소를 만날 시, 해당 원소를 0처리 하는 방법이 있을 거 같다. 그런데 이것도 만난 원소 외에 다른 같은 종류의 원소를 0 처리해야 하므로 추가 기능 구현을 해야하니 복잡할 거 같다.
import java.util.*;
class Solution {
public int solution(int[] nums) {
int count = nums.length/2;
int answer = 0;
List<Integer> kind = new ArrayList<>();
for(int i = 0 ; i < nums.length ; i++) {
if (kind.contains(nums[i])==false){
kind.add(nums[i]);
}
}
int size= kind.size();
if(count<=size) answer = count;
else answer = size;
return answer;
}
}
O(N^2)
알고리즘 로직 구현은 쉬웠으나, List 문법 헷갈려서 시간 소요
- List 선언
- List.contains 함수
HashSet
: Set 인터페이스에서 지원하는 구현 클래스이다.
순서대로 입력되지 않고, 일정하게 유지되지 않는다.
HashSet은 null 요소도 허용한다.
중복을 허용하지 않는다.
참고 : https://crazykim2.tistory.com/474
import java.util.*;
class Solution {
public int solution(int[] nums) {
int count = nums.length / 2;
HashSet<Integer> kind = new HashSet<>();
for (int num : nums) {
kind.add(num);
}
return Math.min(kind.size(), count);
}
}
HashMap의 중복을 허용하지 않는 특성을 이용한다.
따라서, List 풀이와 달리, 중복 검사 순회도 필요없어, 성능 또한 개선된다.
O(N)