Algorithm/baekjoon

사다리 조작

마닐라 2022. 1. 21. 12:34

📍 문제 설명

 

💡 접근

문제 이해하는데 시간이 꽤나 소요됐다. 가로선을 0~3번까지 추가하여 모든 지점에 대해서 가로선을 만들어 보는 완전탐색 & 백트래킹 문제 였다. 

재귀 호출시 1,1 x,y 지점 모두 가능하나 i,j라고 했을땐 오답이 나온다.

ex) 추가해야할 가로선 갯수 2 i = 1, j = 3이라고 하면

1,3 1,4 가로선 설치가능 여부 확인 부 2,1로 가는게 아니라 2,3 2,4 를 확인하기 때문에!

👩‍💻 코드

import java.util.*;

public class Main {
    static int n, m, h, k, answer;
    static int[][] board,dis;
    static int[] ch,pm, combi;
    static boolean[] visited;
    static boolean flag = false;
    static int[] dx = {-1,1,0,0};
    static int[] dy = {0,0,-1,1};
    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);

        n = kb.nextInt(); //세로선의 갯수 5
        m = kb.nextInt(); //가로선의 갯수 5
        h = kb.nextInt(); //세로선 마다 가로선을 놓을 수 있는 갯수 6
        board = new int[h+1][n+1];
        for(int i = 0; i < m; i++) {
            int x = kb.nextInt();
            int y = kb.nextInt();
            board[x][y] = 1;
            board[x][y+1] = 2;
        }
        //세로선을 0~3개 까지 추가해본다.
        for(int i = 0; i <= 3; i++) {
            System.out.println("추가해야할 가로선의 갯수는 : " + i + "개 입니다.");
            //추가해야할 가로선의 갯수
            answer = i;
            //세로선 시작점,추가한 가로선의 갯수
            T.solution(1, 1, 0);
            if(flag) break;
        }
        System.out.println(flag ? answer : -1);
    }


    static void solution(int x, int y, int count) {
        if(flag) {
            return;
        }
        //가로선을 모두 추가했으면 i번 출발 i번 도착 확인
        if(answer == count) {
            if(check()) flag = true;
            return;
        }

        //가로선 추가하기
        for(int i = x; i <= h; i++) {
            for(int j = y; j < n; j++) {
                //연결된 가로선이 없으면 가로선 추가
                if(board[i][j] == 0 && board[i][j+1] == 0) {
                    board[i][j] = 1;
                    board[i][j+1] = 2;
                    System.out.println("(" + i + ", " + j + ") 좌표에 +1열 까지 가로선 추가했습니다.");
                    solution(1, 1, count +1);
                    System.out.println("확인이 끝났으니 가로선 없앱니다.");
                    //추가한 가로선을 다시 제거한다.
                    board[i][j] = 0;
                    board[i][j+1] = 0;
                }
            }
        }

    }

    //i번 출발 i번 도착이 맞는지 확인하는 메서드
    private static boolean check() {
        for(int i = 1; i <= n; i++) {
            //행
            int nx = 1;
            //열
            int ny = i;

            //끝행까지 탐색
            while (nx <= h) {
                if(board[nx][ny] == 1) ny++; // 우측 이동
                else if (board[nx][ny] == 2) ny--; // 좌측 이동
                nx++; //
            }
            //i번의 도착지점 확인
            if(ny != i) return false;
        }
        return true;
    }


}

 

'Algorithm > baekjoon' 카테고리의 다른 글

안전영역  (0) 2022.01.21
늑대와 양  (0) 2022.01.21
스타트링크  (0) 2022.01.19
DSLR  (0) 2022.01.19
스타트와 링크  (0) 2022.01.18