inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

런타임에러(ArrayIndexOutOfBound) 가 나는 이유

422

opix0306

작성한 질문수 15

0

안녕하세요 강사님

강사님 강의 문제에 대한 질문이 아니라 답변하기 힘드시면 괜찮습니다.
강사님 강의를 다 듣고 추천해주신 백준 문제들을 풀다가 질문이 있어 질문드립니다.

백준 9019 문제에 관한 질문인데 백준에서 채점 받을때 ArrayIndexOutOfBound 가 나는 이유를 제 코드를 살펴봐도 어디서 문제이지 찾을 수 없어 질문드립니다.

9019 의 문제의 솔루션을 구글링 해봐도 다 똑같은 코드로만 작성을 해놔서 제가 작성한 코드가 어디가 문제였는지 알고 싶어 질문드립니다.

package Baekjoon;
import java.util.*;

class DSLR {
    public int result;
    public String command;
    DSLR(int result, String command) {
        this.result = result;
        this.command = command;
    }

}
public class _9019 {
    static boolean[] ch = new boolean[10000];
    static ArrayList<String> list = new ArrayList<>();
    public void BFS(int input, int output) {
        Arrays.fill(ch, false);
        Queue<DSLR> q = new LinkedList<>();

        q.offer(new DSLR(input, ""));

        while(!q.isEmpty()) {

            DSLR tmp = q.poll();
            if (tmp.result == output) {
                list.add(tmp.command);
                break;
            }
            for (int i = 0; i < 4; i++) {
                if(i == 0) {
                    int next_result = (tmp.result * 2) % 10000;
                    if (!ch[next_result]) {
                        String next_command = tmp.command + 'D';
                        ch[next_result] = true;
                        q.offer(new DSLR(next_result, next_command));
                    }
                }
                if (i == 1) {
                    int next_result = tmp.result - 1;
                    if (next_result == 0) next_result = 9999;
                    if (!ch[next_result]) {
                        String next_command = tmp.command + 'S';
                        ch[next_result] = true;
                        q.offer(new DSLR(next_result, next_command));
                    }
                }
                if (i == 2) {
                    int next_result = (tmp.result % 1000) * 10 + (tmp.result / 1000);
                    if (!ch[next_result]) {
                        String next_command = tmp.command + 'L';
                        ch[next_result] = true;
                        q.offer(new DSLR(next_result, next_command));
                    }
                }
                if (i == 3) {
                    int next_result = (tmp.result % 10) * 1000 + tmp.result / 10;
                    if (!ch[next_result]) {
                        String next_command = tmp.command + 'R';
                        ch[next_result] = true;
                        q.offer(new DSLR(next_result, next_command));
                    }
                }
            }

        }

    }
 
    public static void main(String[] args) {
        _9019 T = new _9019();
        Scanner sc = new Scanner(System.in);
        int test = sc.nextInt();
        for (int i = 0; i < test; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            ch[a] = true;
            T.BFS(a, b);
        }
        for(String x : list) {
            System.out.println(x);
        }
    }
}

java 코딩-테스트

답변 1

0

김태원

안녕하세요^^

S 명령어에서 처리를 잘 못한 것 같습니다. 아래와 같이 하니 통과됩니다.

import java.util.*;

class DSLR {
    public int result;
    public String command;
    DSLR(int result, String command) {
        this.result = result;
        this.command = command;
    }

}
public class Main {
    static boolean[] ch = new boolean[10000];
    static ArrayList<String> list = new ArrayList<>();
    public void BFS(int input, int output) {
        Arrays.fill(ch, false);
        Queue<DSLR> q = new LinkedList<>();

        q.offer(new DSLR(input, ""));

        while(!q.isEmpty()) {

            DSLR tmp = q.poll();
            if (tmp.result == output) {
                list.add(tmp.command);
                break;
            }
            for (int i = 0; i < 4; i++) {
                if(i == 0) {
                    int next_result = (tmp.result * 2) % 10000;
                    if (!ch[next_result]) {
                        String next_command = tmp.command + 'D';
                        ch[next_result] = true;
                        q.offer(new DSLR(next_result, next_command));
                    }
                }
                if (i == 1) {
		    int next_result;
		    if (tmp.result == 0) next_result = 9999;
                    else next_result = tmp.result - 1;
                    if (!ch[next_result]) {
                        String next_command = tmp.command + 'S';
                        ch[next_result] = true;
                        q.offer(new DSLR(next_result, next_command));
                    }
                }
                if (i == 2) {
                    int next_result = (tmp.result % 1000) * 10 + (tmp.result / 1000);
                    if (!ch[next_result]) {
                        String next_command = tmp.command + 'L';
                        ch[next_result] = true;
                        q.offer(new DSLR(next_result, next_command));
                    }
                }
                if (i == 3) {
                    int next_result = (tmp.result % 10) * 1000 + tmp.result / 10;
                    if (!ch[next_result]) {
                        String next_command = tmp.command + 'R';
                        ch[next_result] = true;
                        q.offer(new DSLR(next_result, next_command));
                    }
                }
            }

        }

    }
 
    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc = new Scanner(System.in);
        int test = sc.nextInt();
        for (int i = 0; i < test; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            ch[a] = true;
            T.BFS(a, b);
        }
        for(String x : list) {
            System.out.println(x);
        }
    }
}

안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.

0

29

1

갑자기 채점 사이트가 바뀌었어요

0

32

1

문제 리스트 페이지

0

29

1

채점 사이트 관련 질문드립니다

0

24

1

봉우리 문제 질문입니다

0

81

2

씨름 선수 문제에서 각 선수의 몸무게나 키가 같을 수도 있다면?

0

65

0

이 코드랑 영상 코드중에 뭐가 더 좋은 코드인가요?

0

72

0

가중치 방향 그래프에서 가중치가 0인 간선을 표현하는 방법

0

67

1

좌표 정렬 문제 이 코드가 왜 틀린지 모르겠습니다 ㅠㅠ

0

85

2

6-7 강의에서

0

48

1

6-6. 장난꾸러기 질문 있습니다.

0

45

1

강의 수강후 코딩테스트

0

111

1

answer 변수 사용 여부

0

46

1

2중 for문

1

85

2

2-11. 임시반장정하기 (Runtime Error)

0

63

1

혹시 LinkedList 같은 자료 구조들은 따로 배우지 않나요?

0

70

1

이런 풀이는 어떨까요

0

44

1

자바 스트림 방식의 효율성 질문 드립니다.

0

57

1

알고리즘 자료 구조들..

0

62

1

StringBuilder vs BufferdWriter

0

48

1

원더랜드(프림)

0

50

1

이런 코드는 어떤가요?

0

61

1

bfs 풀이

0

57

1

병합정렬

0

56

1