티스토리 뷰

반응형

Using Language : Java

Using Tools : IntelliJ


  1. 프로그래머스 문제 소개

    <나누어 떨어지는 숫자 배열>

    array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
    divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -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]
  2. 문제 풀이 과정
    1. arr[]이 divisor에 나누어지는 경우를 찾는다.
    2. 나누어 떨어지는 경우마다 카운팅을 하여 정답 배열의 길이를 세준다(=j).
    3. 정답 배열answer[]을 선언해준다.
    4. arr[]이 divisor에 나누어 지는 경우에만 for문을 사용하여 answer[]에 값을 넣어준다.
    5. answer[]을 정렬해준다
    6.값을 반환한다.

< Solution3.java >

import java.util.Arrays;

    public class Solution3 {
    public int[] solution(int[] arr, int divisor){
        int j=0;

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

        int[] answer = new int[j];

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


< Solution3Test.java >

import org.junit.Test;

import static org.junit.Assert.assertArrayEquals;

public class Solution3Test {

    @Test
    public void 결과() {
        Solution3 solution = new Solution3();

        int[] arr = {5,9,7,10};
        int divisor = 5;
        int[] answer = {5,10};

        assertArrayEquals(answer,solution.solution(arr,divisor));
    }
}


처음 생각했던 문제 풀이 순서를 이용하여 하드코딩을 진행하였는데,

다음과 같은 에러 사항이 나타났다.



  • 시행착오 1
    java.lang.ArrayIndexOutOfBoundException

코드를 실행하였을 때 위와 같은 오류가 나타나게되었다.
오류 메세지에서도 대충 무엇이 잘못되었는지 알 수있었지만,

더 상세한 오류 내용을 알기위해서 검색한 결과 배열의 Index에러라는 것을 알게 되었다.

코드를 다시 살펴보니 두번째 for문에서 j값을 초기화 해주지 않아 

배열의 index 값이 지정해준 길이보다 커지는 것을 확인할 수 있다.


예 ) < Solution3.java >

import java.util.Arrays;

    public class Solution3 {
    public int[] solution(int[] arr, int divisor){
        int j=0;

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

        int[] answer = new int[j];
        // j 값이 0 이 아닌 숫자로 배열이 선언됨
        // 하지만 0으로 초기화가 되지않아서 아래 for문에서 오류 발생
        for(int i=0;i<arr.length;i++){
            if (arr[i]%divisor==0){
                answer[j]=arr[i];
                j++;
            }
        }
        Arrays.sort(answer);
        return answer;
    }
}

이러한 문제점을 해결하기 위해서 for문을 시작하기 전, j=0으로 초기화 시켜주었다.




이렇게 하고 테스트 결과들을 모두 실행해보니 정상적으로 돌아갔고, 문제가 끝난줄 알아서 프로그래머스에 돌려보았는데,

나누어 떨어지는 경우가 없을때 -1을 반환하는 경우를 처리하지 못해서 오류가 났다.

-1을 반환하는 예외처리를 추가하니 소스코드가 다음과 같이 완성되었다.


예 ) < Solution3.java >

import java.util.Arrays;

public class Solution3 {
    public int[] solution(int[] arr, int divisor){
        int j=0;

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

        int[] answer = new int[j];

        // 나누어 떨어지는 경우가 없을때 -1 반환 예외처리
        // JUnit을 사용해서 테스트시에는 오류가 발생하지 않지만
        // 프로그래머스에선 오류가 발생하여 추가
        if(j==0){
            answer = new int[]{-1};
        }

                // j값 초기화
        j=0;
        for(int i=0;i<arr.length;i++){
            if (arr[i]%divisor==0){
                answer[j]=arr[i];
                j++;
            }
        }
        Arrays.sort(answer);
        return answer;
    }
}


프로그램 실행 결과 성공적이였다.

github에서 문제 확인하기


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함