문제
풀이
1. 주어진 수가 홀수일때만 배열 answer 안에 들어가야 하므로 answer의 크기를 (n+1)/2 로 설정한다.
2. 배열에 값을 저장하기 위한 인덱스 변수 idx를 초기화한다.
3. for문을 사용해 1부터 n까지 2씩 증가시켜 홀수만 찾는다.
4. 찾은 홀수를 answer 배열에 저장하고 idx++을 이용해 배열 answer의 idx를 증가시킨다.
5. 반복문이 끝나면 배열 answer를 반환한다.
에러 사항)
나는 처음에 배열에는 따로 인덱스 변수를 주지않고 for 문에 작성한 변수 i를 그대로 answer 인덱스에 적용해서 아래와 같은 코드를 만들었었다.
class Solution {
public int[] solution(int n) {
int[] answer = new int[(n+1)/2];
for(int i=1; i<=n; i+=2){
answer[i] = i;
}
return answer;
}
}
하지만 테스트 실행결과 아래와 같은 에러가 발생했다.
`Index 9 out of bounds for length 8` 는 배열의 길이가 8인데 9번 인덱스를 접근하려고 했기 때문에 발생한 에러라는 것이다. 이것은 배열의 길이가 적절하게 설정되지 않았거나, 배열의 인덱스를 제대로 제어하지 않고 증가시켰기 때문에 발생한다.
나는 배열이 n까지의 모든 홀수를 사용하기 위해서 배열의 크기를 (n+1)/2 으로 설정했다.
이 때문에 배열의 인덱스 범위는 0부터 `(n+1)/2 - 1` 까지가 되는데 루프변수 `i`를 인덱스로 직접 사용하고 있기 때문에 문제가 발생한다. 조건식에서 `i`는 1에서 시작해서 2씩 증가하므로 항상 홀수값을 유지를 하는데 배열의 크기가 홀수인 경우 홀수 i를 인덱스로 직접 사용하면 인덱스가 배열범위를 벗어나게 되는 것이다.
그래서 ArrayIndexOutOfBoundsException예외가 발생한 것이다.
예를들면, n==7 인경우 배열의 크기는 `(7+1)/2 = 4`이다.
for문 루프를 통해 인덱스 1,3,5,7에 값을 할당하려고 시도하지만 크기가 4인 배열의 유효한 인덱스는 0,1,2,3이다. 따라서 i가 5가 되면 ArrayIndexOutOfBoundsException 가 발생하는 것이다. 유효한 배열 범위를 넘어갔으니까.
따라서, 이런 예외를 해결하기 위해서는 answer 배열에 인덱스를 새로 초기화한 변수를 넣어 주는 것이 좋다.
해당 코드에서 answer[i] 부분을 answer[idx]로 바꾸고, for문이 지날때마다 자동으로 인덱스 숫자가 증가할 수 있도록 answer[idx++]을 사용했더니 테스트가 정상적으로 성공했다.
코드
class Solution {
public int[] solution(int n) {
int[] answer = new int[(n+1)/2];
int idx = 0;
for(int i=1; i<=n; i+=2){
answer[idx++] = i;
}
return answer;
}
}
++추가로 Stream을 사용해 프로그래밍을 한 예시도 정리해본다.
import java.util.stream.IntStream;
class Solution {
public int[] solution(int n) {
return IntStream.rangeClosed(0, n).filter(value -> value % 2 == 1).toArray();
}
}
(설명)
1. IntStream.rangeClosed(0,n) 을 통해 0부터 n까지의 정수스트림을 생성한다.
IntStream.rangeClosed 는 시작값부터 끝값까지의 정수스트림을 생성하는 함수이다.
2. filter 메소드를 사용하여 스트림에서 만족하는 요소만 걸러낸다. 위의 코드에서는 value %2==1 을 사용해 홀수값만 걸러낸다.
3. toArray() 메소드를 사용하여 최종적으로 걸러진 홀수값을 가지고 있는 스트림을 배열로 반환한다.
'하루하루 > 프로그래머스 문제풀이' 카테고리의 다른 글
[Lv.0 - Java] 120910 - 세균 증식 (0) | 2023.11.19 |
---|---|
[Lv.0 - Java] 120908 - 문자열안에 문자열 (0) | 2023.11.19 |
[Lv.0 - Java] 120825. 문자 반복 출력하기 (0) | 2023.11.15 |
[Lv.0 - Java] 120818 - 옷가게 할인 받기 (1) | 2023.11.13 |
[Lv.0 - Java] 120909 - 제곱수 판별하기 (0) | 2023.11.13 |