개발자 톡
연습문제 톡
[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회_정기_코딩_인증평가_기출]_순서대로_방문하기