자바 - [공원 산책] 문제 런타임 에러 계속 해결 못하고 있는데 원인 알 수 있을까요..

조회수 1496회
//여기에 코드를 입력하세요
public int[] solution(String[] park, String[] routes) {
        int[] answer = new int[2];
        int x = 0;
        int y = 0;
        String way = "";
        int go = 0;
        for( String map : park ){
            System.out.println(map);
            int where = map.indexOf("S");

            if(where != -1){// S 가 있으면 for문 탈출
                y = where;
                break;
            }
            x++; 
        }

        System.out.println("현재위치 >> "+ x + ", "+ y );


        for(String route : routes){
            String[] how = route.split(" ");
            way = how[0];//방향
            go = Integer.parseInt(how[1]);//얼마나 갈지
            String goString = "";
            System.out.println(way + "방향으로 "+ go+ "가야함");

            if(way.equals("E") && (y + go) <= (park[x].length() - 1) ){
                goString = park[x].substring(y+1 , y+1+go);//경로
                System.out.println(goString);
                if(!goString.contains("X")){//경로에 X 포함된 경우
                    System.out.println("x 없으니 감");

                    y =y + go;
                    System.out.println("현재위치 >> "+ x + ", "+ y );
                }else{
                    System.out.println("x있음");
                    System.out.println(goString);
                }
            }else if(way.equals("W") && (y - go) >= 0){
                goString = park[x].substring(y-go , y);//경로
                if(!goString.contains("X")){//경로에 X 포함된 경우
                    System.out.println("x 없으니 감");

                    y =y - go;
                    System.out.println("현재위치 >> "+ x + ", "+ y );
                }else{
                    System.out.println("x있음");
                    System.out.println(goString);
                }
            }else if(way.equals("N") && (x - go) >= 0){
                boolean noX = true;
                for(int i = x-1; i >= (x - go); i-- ){
                    if(park[i].charAt(y) == 'X'){//경로에 X 포함된 경우
                        noX = false;
                    }     
                }
                if(noX){
                    System.out.println("x 없으니 감");

                    x =x - go;
                    System.out.println("현재위치 >> "+ x + ", "+ y );
                }else{
                    System.out.println("x있음");
                }
            }else if(way.equals("S") && (x + go) <= park.length){
                boolean noX = true;
                for(int i = x+1; i <= (x + go); i++ ){
                    if(park[i].charAt(y) == 'X'){//경로에 X 포함된 경우
                        noX = false;
                    }     
                }
                if(noX){
                    System.out.println("x 없으니 감");

                    x =x + go;
                    System.out.println("현재위치 >> "+ x + ", "+ y );
                }else{
                    System.out.println("x있음");
                }
            }else{
                System.out.println("범위 벗어남");
            }
        }

        System.out.println("최종");
        System.out.println(x);
        System.out.println(y);

        answer[0] = x;
        answer[1] = y;

        return answer;
    }
  • 에러는 어떤 에러가 나오나요? 엽토군 2023.6.7 11:01

1 답변

  • 이 문제에서 런타임 에러가 발생하는 이유는 범위를 넘어가는 배열 인덱스에 접근하려고 시도하기 때문입니다. 코드에서 "S" (남쪽)으로 이동하는 경우를 살펴보면, 다음과 같은 코드를 볼 수 있습니다:

    else if(way.equals("S") && (x + go) <= park.length){
        boolean noX = true;
        for(int i = x+1; i <= (x + go); i++ ){
            if(park[i].charAt(y) == 'X'){//경로에 X 포함된 경우
                noX = false;
            }     
        }
        if(noX){
            System.out.println("x 없으니 감");
            x =x + go;
            System.out.println("현재위치 >> "+ x + ", "+ y );
        }else{
            System.out.println("x있음");
        }
    }
    

    여기서, (x + go) <= park.length 라는 조건은 x + go가 park의 크기를 넘지 않도록 하는 것을 목표로 하지만, 인덱스는 0부터 시작하기 때문에, park.length는 실제로 유효한 인덱스가 아닙니다. 따라서, 이 조건을 (x + go) < park.length로 변경해야 합니다.

    또한, 이러한 범위 확인은 다른 방향에 대해서도 수행해야 합니다. 'E'(동) 방향과 'W'(서) 방향에 대해서도 동일한 방법으로 범위 확인을 수행해야 하며, 문자열의 길이를 넘어가는 범위에 접근하지 않도록 주의해야 합니다.

    이러한 수정을 하면 런타임 에러를 해결할 수 있을 것입니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)