자바로 알고리즘 문제를 풀고 있는데 ArrayIndexOutOfBoundsException 에러가 납니다.


백준 온라인 저지에서 문제 풀고있는데 답이 안나옵니다... C로 코딩했을때는 에러가 안나는데 자바로만 하면 if(arr[x][y-1] == 1 && y-1 >= 0) 줄에서 java.lang.ArrayIndexOutOfBoundsException 에러가 납니다... 왜 나는지 이유는 알겠는데 어떻게 해결해야 할지 모르겠네요...

고수님들 답변 부탁드립니다.

이미지 이름이나 설명을 여기에 넣어주세요.

이미지 이름이나 설명을 여기에 넣어주세요.

package baekjun;

import java.util.Scanner;

public class problem6{
    static int M,N,K;
    static int[][] arr;
    static int[][] visited;
    static int testcase;


    public static void main(String[] args){
        int myX = 0;
        int myY = 0;

        Scanner sc = new Scanner(System.in);

        testcase = sc.nextInt();
        M = sc.nextInt();
        N = sc.nextInt();
        K = sc.nextInt();

        arr = new int[M][N];

        for (int i = 0; i < M; i++) {
            for (int j = 0; j < N; j++) {
                arr[i][j] = 0;
            }
        }

        for(int k = 0; k<testcase; k++) {
            int count = 0;

            for (int i = 0; i < K; i++){
                myX = sc.nextInt();
                myY = sc.nextInt();
                arr[myX][myY] = 1;
            }

            for(int i = 0; i<M; i++) {
                for (int j = 0; j<N; j++) {
                    if(arr[i][j] == 1) {
                        DFS(i, j);
                        count++;
                    }
                }
            }
            System.out.println(count);
        }
    }

    static void DFS(int x, int y){
        arr[x][y] = 0;

        if(arr[x+1][y] == 1 && x+1 < M) 
            DFS(x+1, y);
        if(arr[x][y+1] == 1 && y+1 < N) 
            DFS(x, y+1);
        if(arr[x-1][y] == 1 && x-1 >= 0) 
            DFS(x-1, y);
        if(arr[x][y-1] == 1 && y-1 >= 0) 
            DFS(x, y-1);
    }
}
}

  • 에러에 대한 질문을 하면서 코드를 올리실때는 어느 줄에서 에러가 나는지를 설명해 주셨으면 합니다.    GreppTod   2016.4.12 10:57     
  • 맨 밑에 if(arr[x][y-1] == 1 && y-1 >= 0) 줄에서 에러난다고 글에 써놨는데 못보셨는지요    hsyoon702   2016.4.12 11:03     
  • 제목 바꿨습니다. 죄송합니다.    hsyoon702   2016.4.12 11:09     
  • 아. 제가 내용을 잘 못봤네요. 감사합니다.    정두식   2016.4.12 11:18     
조회수 414


1 답변


좋아요
1
싫어요
채택취소하기
 if(arr[x][y-1] == 1 && y-1 >= 0) 

 if(y-1 >= 0 && arr[x][y-1] == 1) 

으로 바꾸세요.

논리연산은 동시에 하는 것이 아니라 앞의 문장 부터 차례대로 실행합니다. 다음 문장을 실행하는 것은 다음을 따릅니다.

  • 논리곱 - AND(&&) 의 경우, 앞의 결과나 False가 되면 그 뒤의 문장은 실행하지 않습니다.
    • 이는 논리적으로 A && B && C 라고 할 때, A가 false이면 B, C의 결과와 상관없이 전체 결과가 false이기 때문입니다. 따라서, B와 C를 확인할 필요가 없습니다.
  • 논리합 - OR(||)의 경우는, 앞의 결과가 True가 되면 그 뒤의 문장은 실행하지 않습니다.
    • 논리합은 A || B || C 라고 할 때, A가 true이면, B와 C의 결과와 상관없이 전체 결과는 true가 됩니다. 따라서 B, C는 확인할 필요가 없습니다.
  • 2016년 04월 12일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

  • 감사합니다 ㅜㅜ    hsyoon702   2016.4.12 11:10     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close