[Java] 나누어 떨어지는 숫자 배열 (programmers)

Haeun Noh·2022년 12월 22일
0

programmers

목록 보기
26/64
post-thumbnail

1222


문제 설명

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


제한사항

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


입출력 예

arrdivisorreturn
[5, 9, 7, 10]5[5, 10]
[2, 36, 1, 3]1[1, 2, 3, 36]
[3,2,6]10[-1]

입출력 예 설명

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

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

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


소스 코드

import java.util.Arrays;

class Solution {
    public int[] solution(int[] arr, int divisor) {
        int[] answer;
        int cnt = 0;
        for ( int i = 0; i < arr.length; i++) {
            if ( arr[i] % divisor == 0) cnt++;
        }
        if ( cnt >= 1) answer = new int[cnt];
        else {
            answer = new int[1];
            answer[0] = -1;
            return answer;
        }
        int j = 0;
        for ( int i = 0 ; i < arr.length; i++) {
            if ( arr[i] % divisor == 0) answer[j++] = arr[i];
        }
        Arrays.sort(answer);
        return answer;
    }
}

소스 풀이

import java.util.Arrays;

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

오름차순 정렬을 위한 Arrays.sort()메서드를 이용하기 위해 javautil파일에 있는 Arrays클래스를 import해서 가져온다.

반환타입이 int 배열이므로 답을 저장할 변수인 answer도 똑같이 int[]로 선언해준다. 아직 답 개수가 얼마나 있는지를 모르기 때문에 생성 단계까지는 나아가지 않는다.

divisor로 나누어 떨어지는 arr안의 수가 몇 개인지를 저장할 cnt변수를 0으로 세팅한다.


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

for문arr의 크기만큼 돌려서 arr 안의 divisor로 나누어떨어지는 수가 몇 개인지를 파악한다.

만약 arr안의 [i]번째 방의 수를 divisor로 나누었을 때 나머지가 0이라면 나누어 떨어지는 수이기에 cnt1 증가시켜준다.


        if ( cnt >= 1) answer = new int[cnt];
        else {
            answer = new int[1];
            answer[0] = -1;
            return answer;
        }

이제 답의 개수가 다 구해졌으므로 위에서 선언만 해주었던 answer 배열을 생성해줄 차례이다. 선언만 해줄 경우에는 방의 주소가 배정되지 않은 상태이기 때문에 값을 저장할 수 없다. 따라서 반드시 선언도 해주어야 한다.

만약 cnt1보다 크다면, 즉 arr안에 divisor로 나누어 떨어지는 수가 존재한다면 cnt만큼 answer방을 생성해준다.

만약 cnt0이라면, 즉 arr안에 divisor로 나누어 떨어지는 수가 존재하지 않는다면 answer방의 개수를 1로 잡고 선언한 뒤 answer[0]방에 -1을 넣고 answer배열에 들어있는 값을 return해준다. 여기서 왜 바로 return -1을 해주지 않았냐면, 메서드 solution의 반환타입이 int[]이기 때문에 이에 따라 answer배열에 값을 저장한 뒤 return해준 것이다.

!주의! return answer[0]은 int배열이 아니라 int를 반환시키는 것임으로 반드시 배열명인 answer을 반환하도록 하자

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

arr의 요솟값을 나타낼 i와, answer의 요솟값을 나타낼 j를 각각 0으로 초기화시킨다.

for문을 반복하여 돌리며 arr안의 전체 수를 훑는다. divisor로 나누어떨어지는 수를 만나면 arr[i]의 값을 answer[j]방에 저장한다. 여기서 j++answer[j]arr[i]의 값이 저장된 후에 증가되므로 요솟값 부분에 증감식을 써도 상관없다.


        Arrays.sort(answer);
        return answer;

이렇게 모아진 answer 배열은 오름차순으로 정렬을 해주어야 하기 때문에 앞서 import했던 Arrays클래스의 sort()메서드를 사용하여 answer배열을 오름차순 정렬해준다.

그 후 오름차순 정렬된 answer배열을 return하여 프로그램을 종료한다.


실행 화면



profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글