[99클럽 코테 스터디_ DAY 6] 폰켓몬

yewon·2024년 7월 26일
0

스터디

목록 보기
6/22
post-thumbnail

가장 많은 종류의 포켓몬 가지기

✏️오늘의 문제



💡나의 풀이


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

이 코드는 다음과 같은 과정을 거쳐 문제를 해결합니다:

  1. Arrays.stream(nums): 입력 배열 nums를 스트림으로 변환합니다.
  2. .boxed(): 기본 타입 int 스트림을 Integer 객체 스트림으로 변환합니다.
  3. .collect(Collectors.collectingAndThen()): 스트림의 요소를 수집하고 추가로 처리합니다.
    • Collectors.toSet(): 중복 요소를 제거하고 Set으로 변환합니다.
    • Integer.min(phonekemons.size(), nums.length / 2): 고유한 요소의 개수와 nums.length / 2의 최소값을 반환합니다.

코드의 동작 과정을 다시 설명하면

  1. 입력 배열 nums를 스트림으로 변환합니다.
  2. 기본 타입 int 스트림을 Integer 객체 스트림으로 변환합니다.
  3. Collectors.toSet()을 사용하여 중복 요소를 제거하고 Set으로 변환합니다.
  4. Collectors.collectingAndThen()을 사용하여 Set의 크기와 nums.length / 2의 최소값을 반환합니다.

💡HashSet 이용풀이


 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);
    }
  1. HashSet<Integer> types = new HashSet<>(); 를 통해 폰켓몬 종류 번호를 저장할 HashSet을 생성합니다.
  2. for (int num : nums) { types.add(num); } 를 통해 nums 배열의 각 폰켓몬 종류 번호를 types HashSet에 추가합니다. 이 과정에서 중복된 번호는 자동으로 제거됩니다.
  3. types.size() 는 선택할 수 있는 폰켓몬의 최대 종류 수를 나타냅니다.
  4. nums.length / 2 는 선택해야 하는 폰켓몬의 개수, 즉 N/2를 나타냅니다.
  5. Math.min(types.size(), nums.length / 2) 를 통해 선택할 수 있는 폰켓몬의 최대 종류 수와 선택해야 하는 폰켓몬의 개수 중 더 작은 값을 반환합니다.


➕ HashSet: 중복을 허용하지 않는 데이터 구조


HashSet은 자바 컬렉션 프레임워크에서 제공하는 중복을 허용하지 않는 데이터 구조입니다.

1. 중복 허용 안함

HashSet은 중복된 값을 저장하지 않습니다. 즉, 같은 값이 두 번 이상 추가되면 하나만 저장됩니다.

2. 순서 보장 안함

HashSet은 요소를 저장할 때 순서를 보장하지 않습니다. 따라서 요소를 추가/삭제할 때마다 순서가 바뀔 수 있습니다.

3. Null 허용

HashSet은 null 값도 허용합니다. 하지만 null은 오직 하나만 저장됩니다.

4. 해시 테이블 기반

HashSet은 내부적으로 HashMap을 사용하여 구현됩니다. 이를 통해 빠른 검색, 삽입, 삭제 등의 성능을 제공합니다.

활용 사례

HashSet은 중복을 허용하지 않는 데이터 집합을 관리할 때 유용합니다. 예를 들어, 중복 없는 고유한 값들의 집합을 저장하거나, 배열에서 중복된 값을 제거할 때 사용할 수 있습니다.

이처럼 HashSet은 중복 제거, 고유한 값 관리 등의 용도로 널리 사용되는 자바의 대표적인 데이터 구조입니다.

0개의 댓글