쫑쫑이의 블로그

백준 17070 파이프 옮기기 1 Java [DFS] 본문

알고리즘/백준

백준 17070 파이프 옮기기 1 Java [DFS]

쫑쫑2 2022. 10. 5. 23:49

https://www.acmicpc.net/problem/17070

 

17070번: 파이프 옮기기 1

유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의

www.acmicpc.net

공통적으로 대각선 체크(오른쪽, 아래, 대각선 오른쪽아래 모두 0인지)해주고

가로와 대각선일때 가로 체크(오른쪽 0인지),

세로와 대각선일때 세로 체크(아래 0인지)해서

dfs로 탐색해서 N,N에 도달하면 카운트해준다

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;


public class Main {
    static int[][] temps;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        temps = new int[N][];
        Stack<int[]> stack = new Stack<>();
        stack.add(new int[]{0, 0, 1});
        int cnt = 0;
        for (int n = 0; n < N; n++) {
            temps[n] = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        }
        while (!stack.isEmpty()) {
            int[] arr = stack.pop();
            if (arr[1] == N - 1 && arr[2] == N - 1) cnt++;
            else {
                if (isRange(arr[1], arr[2], N) && isBlock(2, arr)) stack.add(new int[]{2,arr[1]+1,arr[2]+1});
                if ((arr[0] == 0 || arr[0] == 2) && isRange(arr[2], N) && isBlock(0, arr)) stack.add(new int[]{0, arr[1], arr[2] + 1});
                if ((arr[0] == 1 || arr[0] == 2) && isRange(arr[1], N) && isBlock(1, arr)) stack.add(new int[]{1, arr[1] + 1, arr[2]});
            }
        }
        System.out.println(cnt);
    }
    
    static boolean isRange(int value, int num) {
        return (value < num - 1) ? true : false;
    }
    static boolean isRange(int value1, int value2, int num) {
        return (value1 < num - 1 && value2 < num - 1) ? true : false;
    }

    static boolean isBlock(int arrow, int[] arr) {
        if (arrow == 0) return temps[arr[1]][arr[2]+1] == 0 ? true : false;
        else if (arrow == 1) return temps[arr[1]+1][arr[2]] == 0 ? true : false;
        else return (temps[arr[1]][arr[2]+1] == 0 && temps[arr[1]+1][arr[2]] == 0 && temps[arr[1]+1][arr[2]+1] == 0) ? true : false;
    }

}