생각정리/코딩테스트

[JAVA][Level1]PROGRAMMERS 나누어 떨어지는 숫자 배열

생각중임 2023. 8. 19. 20:07

나누어 떨어지는 숫자 배열


문제 설명

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

제한사항

  • arr은 자연수를 담은 배열입니다.
  • 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
  • divisor는 자연수입니다.
  • array는 길이 1 이상인 배열입니다.

입출력 예

arr divisor return
[5, 9, 7, 10] 5 [5, 10]
[2, 36, 1, 3] 1 [1, 2, 3, 36]
[3, 2, 6] 10 [-1]

입출력 예 설명

입출력 예#1
arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다.

입출력 예#2

arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다.

입출력 예#3
3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.

주어진 문제

class Solution {
    public int[] solution(int[] arr, int divisor) {
        int[] answer = {};
        return answer;
    }
}

나의 문제풀이

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        // 동적 배열을 사용하기 위해 answer를 list로 선언.
        ArrayList<Integer> answer = new ArrayList<>();
        
        // divisor로 나눠지는 값을 answer에 추가한다.
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] % divisor == 0) {
                answer.add(arr[i]);
            }
        }
        
        if (answer.isEmpty()) { // answer값이 비었으면 -1을 추가하고
            answer.add(-1);
        } else { // 아니면 오름차순 정렬
            answer.sort(Comparator.naturalOrder());
        }
        
        // 스트림의 메서드를 이용해 int형 배열로 변환하여 출력
        return answer.stream().mapToInt(i -> i).toArray();
    }
}
  • ArrayList를 이용해서 divisor로 나눠지는 값을 입력한다.
  • list가 비어 있으면 -1을 입력하고 아니면 오름차순 정렬을 해준다.
  • stream().mapToInt()를 이용해서 int[]의 형태로 출력해준다.

다양한 방법으로 풀어보았는데 결국 마지막에 int형 배열로 어떻게 변환해 주는가에서 막혀서 찾아보다 스트림으로 mapToInt()를 이용해서 인트형으로 변환하는 걸 사용했서 문제를 풀었다.
스트림에 관해서는 익숙하지 않아서 사용법도 잘 모르고 주로 사용되는 메서드도 몰라서 이 부분에 대해서 좀 더 공부해야겠다.
똑같은 작업을 반복하더라도 나눠지는 수의 개수를 구하고 이후에 배열을 정의해서 사용했다면 더 쉬웠을까?

 

 

문제 출처 - https://school.programmers.co.kr/learn/courses/30/lessons/12910