[BOJ] 17070 파이프 옮기기1

2 분 소요

구현 예제

문제

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

문제 풀이

package Baekjoon.DP;

/**
 * Created by kyeahen.
 * Title : 17070 파이프 옮기기1
 * Category : dp, 그래프 탐색
 * Date: 2021/03/30
 */

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ_17070 {

    static int N;
    static int[][] map;
    static int result = 0;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        N = Integer.parseInt(br.readLine());
        map = new int[N + 1][N + 1];

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

        // "가장 처음에 파이프는 (1, 1)와 (1, 2)를 차지하고 있고, 방향은 가로이다."
        dfs(1, 2, 0); //dir = 0(가로), 1(세로), 2(대각선)
        System.out.println(result);
    }

    // x는 세로, y는 가로
    // direction이 0일 때는 파이프가 가로 방향, 1일 때는 세로 방향, 2일 때는 대각선 방향.
    public static void dfs(int x, int y, int dir) {

        if (x == N && y == N) { // 종료 조건
            result++;
            return;
        }

        /*
        - "파이프를 밀 수 있는 방향은 총 3가지가 있으며, →, ↘, ↓ 방향이다."
        - "회전은 45도만 회전시킬 수 있으며, 미는 방향은 오른쪽, 아래, 또는 오른쪽 아래 대각선 방향이어야 한다."
        - "파이프가 가로로 놓여진 경우에 가능한 이동 방법은 총 2가지, 세로로 놓여진 경우에는 2가지,
          대각선 방향으로 놓여진 경우에는 3가지가 있다."
         */
        if (dir == 0) { //파이프가 가로 방향 - 오른쪽, 대각선

            // 파이프가 범위 내에 있고, 좌표가 벽이 아닌 경우
            if (y + 1 <= N && map[x][y + 1] != 1) { //오른쪽
                dfs(x, y + 1, 0); //가로
            }

        } else if (dir == 1) { //파이프가 세로 방향 - 아래, 대각선

            // 파이프가 범위 내에 있고, 좌표가 벽이 아닌 경우
            if (x + 1 <= N && map[x + 1][y] != 1) { //아래
                dfs(x + 1, y, 1); //세로
            }

        } else if (dir == 2) { //파이프가 대각선 방향 - 오른쪽, 아래, 대각선

            // 파이프가 범위 내에 있고, 좌표가 벽이 아닌 경우
            if (y + 1 <= N && map[x][y + 1] != 1) { //오른쪽
                dfs(x, y + 1, 0); //가로
            }

            // 파이프가 범위 내에 있고, 좌표가 벽이 아닌 경우
            if (x + 1 <= N && map[x + 1][y] != 1) { //아래
                dfs(x + 1, y, 1); //세로
            }
        }

        // 대각선 (파이프가 범위 내에 있고, 좌표가 벽이 아닌 경우)
        if (y + 1 <= N && x + 1 <= N && map[x][y + 1] != 1 && map[x + 1][y] != 1 && map[x + 1][y + 1] != 1) {
            dfs(x + 1, y + 1, 2);
        }
    }

}

TMI

21/03/31: 알고리즘 스터디 문제 풀이🤓

댓글남기기