✏️오늘의 문제
public int solution(int[] nums) {
int answer=0;
int[] arr = new int[nums.length/2];
int[] distinctNums = Arrays.stream(nums).distinct().toArray();
int arrSize = Math.min(distinctNums.length, arr.length);
for(int i=0; i<arrSize;i++){
arr[i] = distinctNums[i];
if(arr[i]!=0){
answer++;
}
}
return answer;
}
처음 문제를 풀었을 때 arrSize대신 arr.length를 사용했더니 distinctNums의 길이가 arr의 길이보다 작아 값을 가져오지 못해 ArrayIndexOutOfBoundsException 즉 인덱스 오류가 발생했었습니다.
이 문제를 Matn.min()을 이용하여 distinctNums의 길이와 arr의 길이를 비교하여 더 작은 것을 기준으로 for문을 돌림으로 해결하였습니다.
public int solution(int[] nums) {
return Arrays.stream(nums)
.boxed()
.collect(Collectors.collectingAndThen(Collectors.toSet(),
phonekemons -> Integer.min(phonekemons.size(), nums.length / 2)));
}
이 코드는 다음과 같은 과정을 거쳐 문제를 해결합니다:
Arrays.stream(nums)
: 입력 배열 nums
를 스트림으로 변환합니다..boxed()
: 기본 타입 int
스트림을 Integer
객체 스트림으로 변환합니다..collect(Collectors.collectingAndThen())
: 스트림의 요소를 수집하고 추가로 처리합니다.Collectors.toSet()
: 중복 요소를 제거하고 Set
으로 변환합니다.Integer.min(phonekemons.size(), nums.length / 2)
: 고유한 요소의 개수와 nums.length / 2
의 최소값을 반환합니다.코드의 동작 과정을 다시 설명하면
nums
를 스트림으로 변환합니다.int
스트림을 Integer
객체 스트림으로 변환합니다.Collectors.toSet()
을 사용하여 중복 요소를 제거하고 Set
으로 변환합니다.Collectors.collectingAndThen()
을 사용하여 Set
의 크기와 nums.length / 2
의 최소값을 반환합니다. public int solution(int[] nums) {
// nums 배열에서 중복을 제거하여 폰켓몬 종류 번호들을 저장
HashSet<Integer> types = new HashSet<>();
for (int num : nums) {
types.add(num);
}
// 폰켓몬 종류 수와 N/2를 비교하여 더 작은 값을 반환
return Math.min(types.size(), nums.length / 2);
}
HashSet<Integer> types = new HashSet<>();
를 통해 폰켓몬 종류 번호를 저장할 HashSet을 생성합니다.for (int num : nums) { types.add(num); }
를 통해 nums
배열의 각 폰켓몬 종류 번호를 types
HashSet에 추가합니다. 이 과정에서 중복된 번호는 자동으로 제거됩니다.types.size()
는 선택할 수 있는 폰켓몬의 최대 종류 수를 나타냅니다.nums.length / 2
는 선택해야 하는 폰켓몬의 개수, 즉 N/2를 나타냅니다.Math.min(types.size(), nums.length / 2)
를 통해 선택할 수 있는 폰켓몬의 최대 종류 수와 선택해야 하는 폰켓몬의 개수 중 더 작은 값을 반환합니다.HashSet은 자바 컬렉션 프레임워크에서 제공하는 중복을 허용하지 않는 데이터 구조입니다.
HashSet은 중복된 값을 저장하지 않습니다. 즉, 같은 값이 두 번 이상 추가되면 하나만 저장됩니다.
HashSet은 요소를 저장할 때 순서를 보장하지 않습니다. 따라서 요소를 추가/삭제할 때마다 순서가 바뀔 수 있습니다.
HashSet은 null 값도 허용합니다. 하지만 null은 오직 하나만 저장됩니다.
HashSet은 내부적으로 HashMap을 사용하여 구현됩니다. 이를 통해 빠른 검색, 삽입, 삭제 등의 성능을 제공합니다.
HashSet은 중복을 허용하지 않는 데이터 집합을 관리할 때 유용합니다. 예를 들어, 중복 없는 고유한 값들의 집합을 저장하거나, 배열에서 중복된 값을 제거할 때 사용할 수 있습니다.
이처럼 HashSet은 중복 제거, 고유한 값 관리 등의 용도로 널리 사용되는 자바의 대표적인 데이터 구조입니다.