개발자 톡

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

[HSAT 7회 정기 코딩 인증평가 기출] 순서대로 방문하기 질문 드립니다 !! (java)

등록일
2023-09-12 15:31:18
조회수
761
작성자
ehsdndmldkel

import java.util.*;
import java.io.*;


public class Main
{
    static int[][] map;
    static boolean[][] visited;
    static ArrayList goal;
    static int count = 0;
    static int[] dx = {0,0,1,-1};
    static int[] dy = {1,-1,0,0};
    static int n,m;

    public static void main(String args[]) throws IOException
    {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        map = new int[n][n];
        visited= new boolean[n][n];
        goal = new ArrayList<>();

        for(int i = 0 ; i < n;i++){
            st = new StringTokenizer(br.readLine());
            for(int j = 0 ; j < n;j++){
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        for(int i = 0 ; i < m;i++){
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());

            goal.add(new int[] {x-1,y-1});
            map[x-1][y-1] = 2;
        }

        int[] temp = goal.get(0);
        int[] goal_temp = goal.get(1);
        visited[temp[0]][temp[1]] = true;
        map[goal_temp[0]][goal_temp[1]] = 0;
        DFS(1,temp[0],temp[1],goal_temp[0],goal_temp[1]);

        System.out.println(count);
    }

    static void DFS(int depth, int now_x,int now_y,int goal_x,int goal_y){

        for(int i = 0 ; i < 4 ; i++){
            int next_x = now_x+dx[i];
            int next_y = now_y+dy[i];

            if(next_x >= 0 && next_x < n && next_y >= 0 && next_y < n){
                if(!visited[next_x][next_y] && map[next_x][next_y] == 0){
                    // 방문안했고 0이면 들어가
                    if(next_x == goal_x && next_y == goal_y){

                        if(depth == goal.size()-1) { // 찾았으면
                            count++;
                            return;
                        }else{
                            visited[next_x][next_y] = true;
                            int[] goal_temp = goal.get(depth+1);
                            map[goal_temp[0]][goal_temp[1]] = 0;
                            DFS(depth+1,next_x,next_y,goal_temp[0],goal_temp[1]);
                            map[goal_temp[0]][goal_temp[1]] = 2;
                            visited[next_x][next_y] = false;
                        }
                    }else {
                        visited[next_x][next_y] = true;
                        DFS(depth, next_x, next_y, goal_x, goal_y);
                        visited[next_x][next_y] = false;
                    }
                }
            }

        }

    }

}


이런 식으로 백트래킹을 사용해서 구현을 했는데 몇가지 케이스에 대해서 오답이 나와서 25점이 나오네요 ㅠㅠ

아무리봐도 어느 경우를 놓쳤는지 모르겠는데 혹시 아시는 분 계실까요..

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

이 카테고리의 톡 더보기