나누어 떨어지는 숫자 배열

이윤설·2024년 3월 13일
0

제출코드

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        List<Integer> list = new ArrayList<>();
        int nullCount = 0;

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % divisor != 0) {
                nullCount++;
            }

            if (arr[i] % divisor == 0) {
                list.add(arr[i]);
            }
        }

        if (nullCount == arr.length) {
            list.add(-1);
        }

        int[] answer = new int[list.size()];

        for (int i = 0; i < list.size(); i++) {
            answer[i] += list.get(i);
        }
        // answer = list.toArray(); <- 불가능

        Arrays.sort(answer);

        return answer;
    }
}

모범답안

class Solution {
  public int[] solution(int[] arr, int divisor) {
          int[] answer = Arrays.stream(arr).filter(factor -> factor % divisor == 0).toArray();
          if(answer.length == 0) answer = new int[] {-1};
          java.util.Arrays.sort(answer);
          return answer;
  }
}

Arrays.stream(arr): 배열 arr을 스트림으로 변환한다.

.filter(factor -> factor % divisor == 0): 스트림의 각 요소를 조건에 따라 필터링합니다. 여기서는 주어진 조건 factor % divisor == 0을 만족하는 요소들만을 남긴다. 즉, 배열의 각 요소를 divisor로 나누었을 때 나머지가 0인 경우만을 선택한다.

.toArray(): 필터링된 요소들을 배열로 변환한다. 필터링된 요소들만을 포함하는 새로운 배열이 생성된다.

if(answer.length == 0) answer = new int[] {-1};: 필터링된 배열의 길이가 0인 경우, 즉 나누어 떨어지는 요소가 없는 경우에는, 새로운 배열을 생성하여 -1을 요소로 포함시킨다.

java.util.Arrays.sort(answer);: 필터링된 배열을 정렬한다.

다른 답안 (모범답안x)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        List<Integer> list = new ArrayList<>();
        int nullCount = 0;

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % divisor == 0) {
                list.add(arr[i]);
            } else {
                nullCount++;
            }
        }

        if (nullCount == arr.length) {
            return new int[]{-1};
        }

        // List<Integer>를 Integer[]로 변환
        Integer[] tempArray = list.toArray(new Integer[0]);
        
        // Integer[]를 int[]로 변환
        int[] answer = new int[tempArray.length];
        for (int i = 0; i < tempArray.length; i++) {
            answer[i] = tempArray[i];
        }

        Arrays.sort(answer);

        return answer;
    }
}

배운 점 - 1

  • 스트림(Stream)의 filter() 메소드는 스트림의 각 요소에 대해 특정 조건을 만족하는지를 평가하고, 그 조건을 만족하는 요소들만으로 구성된 새로운 스트림을 생성한다.
  • 스트림.toArray(): 스트림을 배열로 변환한다.

배운 점 - 2

  • toArray(array 크기)를 사용하면 Integer(int 아님) 타입으로 변환할 수 있다. (물론 Integer 말고도 다른 원시타입도 가능하다)

  • Integer[] array = list.toArray(new Integer[0]);: 예를 들어 [1,2,3]이 담긴 list를 array 타입으로 변환하고자 할 때 위 방법을 사용할 수 있다. list.toArray(new Integer[0])에서 new Integer[0]은 반환될 배열의 타입을 Integer[]로 지정하는 역할을 한다. 실제로는 메서드가 리스트의 크기에 맞는 새로운 배열을 생성하여 반환한다. 예를 들어, list가 [1, 2, 3]을 포함하고 있다면, list.toArray(new Integer[0])는 사실상 new Integer[3]과 같은 새로운 배열을 내부적으로 생성하고, [1, 2, 3]을 이 배열에 복사한 뒤 반환한다.
    이 방법은 코드를 더 깔끔하게 만들고, 타입 안전성을 보장하며, 실수로 배열의 크기를 잘못 지정하는 오류를 방지할 수 있다.

  • List를 array로 바꿔야 할 때, 만약 배열의 크기가 확실하다면 toArray(크기)를, 크기가 확실하지 않다면 반복문으로 array로 바꿔주면 된다.

profile
화려한 외면이 아닌 단단한 내면

0개의 댓글