개발자 톡

연습문제 톡 [HSAT 7회 정기 코딩 인증평가 기출] 순서대로 방문하기

이 풀이는 왜 틀린걸까요??

등록일
2024-02-07 11:03:54
조회수
368
작성자
jeny0124
import java.io.*;
import java.util.*;


public class Main {


    static class Pair {
        int x;
        int y;


        public Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }


    static int[][] grid;
    static boolean[][] visited;
    static Pair[] must; // 반드시 방문해야 하는 지점들 목록
    static List<Pair> arr = new ArrayList<>();
    static int[][] move = {{0,1}, {0,-1}, {1,0}, {-1,0}}; // 상하좌우 dx dy 이동
    static int possibleCase = 0;


    static int n;
    static int m;


    public static void checkAllVisited() {
        int count = 0;


        for (Pair pair : arr) { // 방문한 지점들을 모두 확인
            for (int j = 0; j < m; j++) { // 반드시 방문해야 하는 지점들 목록을 모두 확인
                if (pair.x == must[j].x && pair.y == must[j].y) { // 방문한 지점이 반드시 방문해야 하는 지점이라면
                    count++; // 카운트 증가
                    break;
                }
            }
        }


        if (count == m) { // 만약 방문한 지점들이 반드시 방문해야 하는 지점들 개수과 같다면
            possibleCase++;
        }
    }


    public static void choose(int cx, int cy) {




        // 만약 마지막 지점에 도착하면
        if (cx == must[m-1].x && cy == must[m-1].y) {
            checkAllVisited(); // 모든 지점을 방문했는지 확인
            return;
        }


        for(int i=0; i<4; i++) {


            int nx = cx + move[i][0];
            int ny = cy + move[i][1];


            if (0<=nx && nx < n && 0<=ny && ny < n) { // 주어진 격자 범위 안에 있고
                if (!visited[nx][ny] && grid[nx][ny] == 0){ // 방문하지 않았고, 벽이 아니라면


                    visited[nx][ny] = true; // 방문했다고 표시
                    arr.add(new Pair(nx, ny)); // 방문한 지점을 기록


                    choose(nx, ny); // 다음 지점으로 이동


                    visited[nx][ny] = false; // 다시 방문하지 않았다고 표시
                    arr.remove(arr.size() - 1); // 방문한 지점을 기록에서 제거
                }
            }
        }
    }




    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);


        n = sc.nextInt();
        m = sc.nextInt();


        grid = new int[n][n];
        visited = new boolean[n][n];
        must = new Pair[m];


        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                grid[i][j] = sc.nextInt();
            }
        }


        for(int i=0; i<m; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();


            must[i] = new Pair(x-1, y-1);
        }


        choose(must[0].x, must[0].y);


        System.out.println(possibleCase);
    }
}



백트래킹 사용해서 풀어봤는데 예제 테케에서도 오류가 나네요 ㅠㅠ

#[hsat_7회_정기_코딩_인증평가_기출]_순서대로_방문하기

이 카테고리의 톡 더보기