[Java] BRAVEDUCK 오류 관련 질문드립니다.

  • ehdwns2045
    ehdwns2045

    안녕하세요.
    알고스팟에서 열심히.. 연습하고 있는 초보입니다.

    BRAVEDUCK 문제를 푸는데 RTE오류가 발생하여,
    질문을 드리고자 합니다.

    제가 문제를 푼 방법은 우선
    DFS의 개념으로 접근을 하였습니다.
    // 해결방법에 대해 다시 정리하다보니, BFS네요..허허

    ArrayList에 시작점을 넣고,
    시작점부터 건너갈 수 있는 돌을 List에 넣고
    다음으로 List에 들어간 돌의 좌표를 기준으로
    다음으로 넘어갈 수 있는 돌을 찾아 넣는 방식입니다.
    그와 동시에 해당 돌에서 목표 지점까지 갈 수 있을 경우
    Loop를 끝내고 "YES"를 출력합니다.
    해당 Loop가 끝날때까지 목표지점에 갈 수 없는 경우
    "NO"를 출력합니다.

    루프는 ArrayList.size()를 사용해 루프를 돌면서 동적으로
    크기가 변하도록 하였습니다.
    그리고 ArrayList에는 중복되는 돌이 들어가지 않도록 중복검사 후
    집어넣도록 하여, 최대 돌의 갯수만큼만 List에 들어가게 되어
    무한 루프에 빠지는 일은 없습니다.

    제가 나름 예제를 만들어서 테스트를 해보았는데,
    생각이 짧아서 그런지.. 오류가 날만한 예제가 잘 떠오르지 않습니다. 도움을 주신다면 정말로 감사하겠습니다^^

    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class BRAVEDUCK {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            Scanner input = new Scanner(System.in);
    
            int count = input.nextInt();
            int loop_count = 0;
    
            while(loop_count < count) {
    
                int max_jump = input.nextInt();
                int[] s_to_g_point = new int[4];
    
                for(int i=0; i<4; i++) {
                    s_to_g_point[i] = input.nextInt();
                }
    
                int rock_count = input.nextInt();
                int[] rocks_axis = new int[rock_count*2];
    
                for(int i=0; i<rocks_axis.length; i++) {
                    rocks_axis[i] = input.nextInt();
                }
    
                if(JumpDuck(max_jump, s_to_g_point, rocks_axis)) {
                    System.out.println("YES");
                } else {
                    System.out.println("NO");
                }
                loop_count++;
            }
        }
    
        public static boolean JumpDuck(int max_jump, int[] s_to_g_point, int[] rocks_axis) {
    
            ArrayList<Integer> DFS = new ArrayList<Integer>();
    
            int current_x = 0;
            int current_y = 0;
            boolean goal_flag = false;
    
            DFS.add(-1001);
    
            for(int i=0; i<DFS.size(); i++) {
    
                if(i == 0){
                    current_x = s_to_g_point[0];
                    current_y = s_to_g_point[1];
                } else {
                    current_x = rocks_axis[2*DFS.get(i)];
                    current_y = rocks_axis[2*DFS.get(i)+1];
                }
    
                for(int j=0; j<rocks_axis.length/2; j++) {
    
                    if(Math.abs(rocks_axis[2*j] - current_x) <= max_jump && current_y == rocks_axis[2*j+1] ) {
    
                        if(checkDuplicate(DFS, j)) {
                            DFS.add(j);
                        }
    
                    } else if (Math.abs(rocks_axis[2*j+1] - current_y) <= max_jump && current_x == rocks_axis[2*j] ) {
    
                        if(checkDuplicate(DFS, j)) {
                            DFS.add(j);
                        }
                    }
                }
    
                if(Math.abs(s_to_g_point[2] - current_x) <= max_jump && current_y == s_to_g_point[3] ) {
                    goal_flag = true;
                    break;
                } else if (Math.abs(s_to_g_point[3] - current_y) <= max_jump && current_x == s_to_g_point[2] ) {
                    goal_flag = true;
                    break;
                }
            }
    
            return goal_flag;
    
        }
    
        public static boolean checkDuplicate(ArrayList<Integer> DFS, int num) {
    
            boolean flag = true;
    
            for(int i=0; i<DFS.size(); i++) {
                if(num == DFS.get(i)) {
                    flag = false;
                    break;
                }
            }
            return flag;
        }
    }
    

    9년 전
2개의 댓글이 있습니다.
  • JongMan
    JongMan

    상하좌우 네 방향만으로 점프할 수 있는게 아니라, 모든 방향으로 (거리가 J 이하이기만 하다면) 점프할 수 있습니다.


    9년 전 link
  • ehdwns2045
    ehdwns2045

    아..! 문제를 잘 읽어보는게 무엇보다 중요한데..
    참 바보같이.. 댓글 감사합니다ㅎㅎ


    9년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.