음, 제목 그래도 알고리즘 문제를 풀 때, 가장 많이 하는 실수인
ArrayIndexOutOfBoundsException 예외에 대해서 오늘은 가볍게 정리하고 넘어가려 한다.
알고리즘 문제를 풀 때면, ArrayIndexOutOfBoundsException 이 예외를 정말 많이 만나고는 한다.
요즘 있는 코딩테스트의 경우 디버깅을 하기 어려운 경우가 많기 때문에, ( 특히 프로그래머스에서 할 때 )
해당 예외가 뜨면 디버깅이 불가하다. 즉, 처음에 풀 때 잘 풀어야 된다는 뜻!
이 에러가 뜨는 것은 사실 대부분 for문을 정확히 이해하고 있지 못해서인 이유가 많을 것으로 생각된다.
( 필자도 그러했다.. ;; )
정말 간단한 것인데, 너무 기본이라 간과하고 넘어가는 경우가 많은 것 같다.
자, 이 그림 하나면 끝난다.
가장 중요한 것은 for문이 진행되는 순서를 완전히 아는 것이다.
for (int i = m - 1; i >= 0; i--) {
for (int j = n - 1; j >= 0; j--) {
if (map[i][j] == ' ') {
int k;
for (k = i; k >= 0; k--) {
if (map[k][j] != ' ') {
break;
}
}
printAll(m,n);
map[i][j] = map[k][j];
map[k][j] = ' ';
}
}
}
}
실제로 내가 문제를 풀면서 작성했던 코드를 가져와봤다.
이 것을 그대로 돌리게 되면 에러와 마주하게 된다.
바로
for (k = i; k >= 0; k--) {
if (map[k][j] != ' ') {
break;
}
}
이 부분 때문인데, 이유가 무엇일까??
k값이 -1이 되는 경우가 존재하기 때문이다.
엇?? 왜?? 당연히 k가 0일 때 끝나는 거 아니야? 라고 말할 수 있다.
하지만, k=i 에 문제가 있다.
i가 0일 수 있다.
그렇다면,
위에서 보여준 이미지대로 순서를 따라가면
1. k=0
2. k>=0 증감식 만족 ( 다음으로 넘어감 )
3. if(map[k][j] != ' ') -> 만족한다고 가정 ( 다음으로 넘어감 )
4. k-- 으로 향하게 됨 ( k = -1 이 된다. )
5. k>=0 조건 만족안함 ( for문을 빠져나간다. )
6. map[k][j] 값에서 ArrayIndexOutOfBoundsException 에러 발생
음 이 경우는 정말 특이한 케이스긴 하다. 하지만, 이런 for문의 순서를 제대로 인지하고 있지 못하면
이 문제를 해결하기 힘들 것이다.
오늘의 교훈 : 어떤 것을 사용하더라도 확실하게 이해하고 넘어가자..!
'Algorithm' 카테고리의 다른 글
프로그래머스 표편집 JAVA (0) | 2022.03.10 |
---|---|
프로그래머스 2018 KAKAO BLIND 방금그곡 ( 문자열 ) JAVA (0) | 2021.04.29 |
플로이드 와샬 알고리즘 (0) | 2021.04.22 |
BOJ 14503번 로봇청소기 ( 구현 , DFS ) JAVA (0) | 2021.04.19 |
프로그래머스 광고 삽입 KAKAO BLIND 2021 ( 누적 합 ) JAVA (0) | 2021.04.18 |