728x90

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

 

17070번: 파이프 옮기기 1

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

www.acmicpc.net

 

문제

 

풀이

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

public class Main_BJ_17070_파이프옮기기1 {

	static int n, ans;
	static int[][] map;
	static int[] direction = {0, 1, 2};//순서대로 가로, 세로, 대각선
	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());
			}	
		} //map
		
		
		int dir = 0;
		int x=1;
		int y=2;
		route(x, y, dir);
		System.out.println(ans);
		
	}//main
	
	private static void route(int x, int y, int dir) {
		if(x == n && y==n)
			ans++;
		
		switch(dir) {
		case 0:
			// 동쪽
			if(y+1 <= n && map[x][y+1] == 0) {
				route(x, y+1, 0);
			}
			// 동남쪽
			 if(x+1 <=n && y+1<=n && map[x+1][y]==0 && map[x+1][y+1]==0 && map[x][y+1]==0) {
				 route(x+1, y+1, 2);
			 }
			break;
			
		case 1:
			//남쪽
			if(x+1 <= n && map[x+1][y] == 0) {
				route(x+1, y, 1);
			}
			//동남쪽
			if(x+1 <=n && y+1<=n && map[x+1][y]==0 && map[x+1][y+1]==0 && map[x][y+1]==0) {
				 route(x+1, y+1, 2);
			 }
			break;
		case 2:
			//동쪽
			if(y+1 <= n && map[x][y+1] == 0) {
				route(x, y+1, 0);
			}
			//남쪽
			if(x+1 <= n && map[x+1][y] == 0) {
				route(x+1, y, 1);
			}
			//동남쪽
			 if(x+1 <=n && y+1<=n && map[x+1][y]==0 && map[x+1][y+1]==0 && map[x][y+1]==0) {
				 route(x+1, y+1, 2);
			 }
			break;
		}
		
		
		
	}//route
	
}

각 방향대로 보면 된다.

0: 가로 / 1: 세로 / 2: 대각선

 

각 방향별로 갈 수 있는 방향이 정해져있다.

예를 들어, 가로는 동쪽과 동남쪽이 있음!!

 

해당하는 경우마다 범위를 계산하고, map이 0인지 아닌지를 판단한다.(문제 조건)

그리고 DFS로 계속 이동하면 됨!! 

 

 

DP로 하는 방법도 있는데, 3차원 배열을 선언해서,

각 가로, 세로, 대각선에 해당하는 것을 범위를 확인하면서 진행하고, 계속 더해나가주면 된다.

728x90

'코테 > 백준' 카테고리의 다른 글

백준 7569 토마토(JAVA)  (0) 2023.01.10
백준 2920 음계(JAVA)  (1) 2023.01.09
백준 1158 요세푸스 문제(JAVA)  (0) 2022.08.19
백준 2493 탑(JAVA)  (0) 2022.08.17
백준 12891. DNA 비밀번호(JAVA)  (0) 2022.08.16

+ Recent posts