본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 17070 파이프 옮기기 1

by 까망 하르방 2021. 2. 22.
반응형

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

 Input 

6

0 0 0 0 0 0

0 1 0 0 0 0

0 0 0 0 0 0

0 0 0 0 0 0

0 0 0 0 0 0

0 0 0 0 0 0

 

 Output 

13

파이프pipe 종류

* 종류마다 이동 방법이 다르다.

① 『 → 』 의 경우, 2가지

 

② 『 ↓   의 경우, 2가지

③ 『 ↘ 』 의 경우, 2가지

- Pipe의 끝지점 경로 고려.

- Pipe 상태에 따른 경로를 고려하면 아래의 범위에서 움직인다.

  가로, 세로 방향은 다음 끝지점이 벽이지만 확인하면 되지만

  대각선의 경우에는 3 군데를 확인해야 한다.

※ Pipe 이동이 처음부터 불가능하다.

 Input 

5

0 0 1 0 0

0 0 0 0 0

0 0 0 0 0

0 0 0 0 0

0 0 0 0 0

 

 Output 

0


import java.util.Scanner;

public class Main {
    
    static int[][] board;
    static int N, answer = 0;
    // pipe 상태(가로, 세로, 대각선)
    static final int HORIZONTAL = 1;
    static final int VERTICAL = 2;
    static final int DIAGONAL = 3;
    
    static class Pipe{
        // 파이프의 끝 지점만 좌표로 사용
        int x, y;
        int state;
        
        public Pipe(int x, int y, int state) {
            this.x = x;
            this.y = y;
            this.state = state;
        }


        public void move() {
            // Pipe 끝 부분 도착지점 확인
            if(x == N && y == N) {
                answer++;
                return;
            }
            
            if(state == HORIZONTAL) {
                // 가로 이동
                if(y < N && board[x][y+1] != 1) {
                    y++;
                    move();
                    y--;    
                }
                // 대각선 이동
                if( x < N && y < N &&
                        board[x+1][y] != 1 &&
                        board[x][y+1] != 1 &&
                        board[x+1][y+1] != 1
                    ) {
                    x++; y++; state = DIAGONAL;
                    move();
                    x--; y--; state = HORIZONTAL;    
                }
            }
            else if (state == VERTICAL) {
                // 세로 이동
                if(x < N && board[x+1][y] != 1) {
                    x++;
                    move();
                    x--;    
                }
                
                // 대각선 이동
                if( x < N && y < N &&
                        board[x+1][y] != 1 &&
                        board[x][y+1] != 1 &&
                        board[x+1][y+1] != 1
                    ) {
                    x++; y++; state = DIAGONAL;
                    move();
                    x--; y--; state = VERTICAL;
                }
                
            }
            else if (state == DIAGONAL) {
                // 가로 이동
                if(y < N && board[x][y+1] != 1) {
                    y++; state = HORIZONTAL;
                    move();
                    y--; state = DIAGONAL;    
                }
                
                // 세로 이동
                if(x < N && board[x+1][y] != 1) {
                    x++; state = VERTICAL;
                    move();
                    x--; state = DIAGONAL;


                }
                                
                // 대각선 이동
                if( x < N && y < N &&
                        board[x+1][y] != 1 &&
                        board[x][y+1] != 1 &&
                        board[x+1][y+1] != 1
                    ) {
                    x++; y++;
                    move();
                    x--; y--;    
                }
                 
            }
        }
        
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);


        N = Integer.parseInt(sc.next());
        
        board = new int[N+1][N+1];
        for(int i=1; i<=N; i++) {
            for(int j=1; j<=N; j++) {
                board[i][j] = Integer.parseInt(sc.next());
            }
        } // end of input
        
        // 파이프 끝지점을 기준으로 생성
        Pipe pipe = new Pipe(1, 2, HORIZONTAL);
        
        pipe.move();
        
        System.out.println(answer);
    }
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 17281 ⚾  (0) 2021.02.22
[BOJ] 백준 1764 듣보잡  (0) 2021.02.22
[BOJ] 백준 17136 색종이 붙이기  (0) 2021.02.22
[BOJ] 백준 10814 나이순 정렬  (0) 2021.02.22
[BOJ] 백준 1708 블록 껍질  (0) 2021.02.22

댓글