배열 자르기

이윤설·2024년 2월 2일

https://school.programmers.co.kr/learn/courses/30/lessons/120833

제출코드 (오답)

class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        int count = num2 - num1;
        int[] answer = new int[count];
        
        for (int i = 0; i < count ; i++) {
            answer[i] = numbers[num1++];
        } 
        return answer;
    }
}

모범답안

class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        int count = num2 - num1 + 1;
        int[] answer = new int[count];
        
        for (int i = 0; i < count ; i++) {
            answer[i] = numbers[num1++];
        } 
        return answer;
    }
}

배운점

1) 제출코드에서 numbers : [1,2,3,4,5], num1: 1, num2:3 이라고 가정하자. 그럼 당연히 count는 2가 된다.
그다음 반복문의 i < count 부분에서 인덱스 [0, 1] 에서 멈추게 된다.

이것을 해결하기 위해 i <= count로 고치면 절대 안된다.
(number1, number2가 크게 주어져서 ) count가 numbers 배열의 길이와 같거나 큰 경우에는 ArrayIndexOutOfBoundsException이 발생할 수 있다.

ex) numbers=[1,2,3,4,5], num1=0, num2=5, count=5

class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        int count = num2 - num1; // 4
        int[] answer = new int[count];
        
        for (int i = 0; i <= count ; i++) {
            answer[i] = numbers[num1++];
        } 
        return answer;
    }
}

첫 번째 반복(i = 0)에서는 answer[0] = numbers[1]; num1은 2
두 번째 반복(i = 1)에서는 answer[1] = numbers[2]; num1은 3
세 번째 반복(i = 2)에서는 answer[2] = numbers[3]; num1은 4
네 번째 반복(i = 3)에서는 answer[3] = numbers[4]; num1은 5
다섯 번째 반복(i = 4)에서는 answer[4] = numbers[5]; numbers의 크기는 5인데 5번째 인덱스, 즉 6번째 요소를 가져올 수 없으므로 에러가 발생한다.

결론) i <= count로 설정하는 것은 피하자. 배열의 범위를 벗어나지 않도록 안전하게 코드를 작성하기 위해서는 i < count를 유지하고, num2를 포함하려면 count를 num2 - num1 + 1로 설정하는 것이 좋다.

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

0개의 댓글