본문 바로가기

Algorithm

알고리즘 문제 풀 때 자주하는 for문에서의 실수😅 ( JAVA )

음, 제목 그래도 알고리즘 문제를 풀 때, 가장 많이 하는 실수인

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문의 순서를 제대로 인지하고 있지 못하면

이 문제를 해결하기 힘들 것이다.

 

오늘의 교훈 : 어떤 것을 사용하더라도 확실하게 이해하고 넘어가자..!