J

[JAVA] BOJ ๋ฐฑ์ค€ 17070 ํŒŒ์ดํ”„์˜ฎ๊ธฐ๊ธฐ1 ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ’ป Samsung SW Expert

[JAVA] BOJ ๋ฐฑ์ค€ 17070 ํŒŒ์ดํ”„์˜ฎ๊ธฐ๊ธฐ1

snowball๐Ÿฐ 2023. 3. 29. 16:09

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

 

17070๋ฒˆ: ํŒŒ์ดํ”„ ์˜ฎ๊ธฐ๊ธฐ 1

์œ ํ˜„์ด๊ฐ€ ์ƒˆ ์ง‘์œผ๋กœ ์ด์‚ฌํ–ˆ๋‹ค. ์ƒˆ ์ง‘์˜ ํฌ๊ธฐ๋Š” N×N์˜ ๊ฒฉ์žํŒ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ , 1×1ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นธ์€ (r, c)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ r์€ ํ–‰์˜ ๋ฒˆํ˜ธ, c๋Š” ์—ด์˜

www.acmicpc.net

DFS๋กœ๋„ DP๋กœ๋„ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋‹ค!

VER. DP

๐Ÿ’ก ์ „์ฒด ๋กœ์ง
1. ๋ฌธ์ œ์—์„œ ํŒŒ์ดํ”„๋ฅผ ๋†“๋Š” ๋ฐฉ๋ฒ•์ด ๊ทธ ์ „ ํŒŒ์ดํ”„๊ฐ€ ๋†“์—ฌ์ง„ ํ˜•ํƒœ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ์œ„์น˜์™€ ํ˜„์žฌ ์ƒํƒœ์—์„œ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.
(์ฆ‰, ๋ ๋ถ€๋ถ„์ด (x, y)์— ์žˆ๊ณ  ๊ฐ€๋กœ๋กœ ๋†“์—ฌ์ง„ ์ƒํƒœ๋กœ ํŒŒ์ดํ”„๋ฅผ ์˜ฎ๊ธฐ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•ด์•ผ ํ•จ)
2. 3์ฐจ์› ๋ฐฐ์—ด์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ์ œ์ด์…˜์„ ํ•  ๊ฒƒ์ด๋‹ค. (0-๊ฐ€๋กœ, 1-์„ธ๋กœ, 2-๋Œ€๊ฐ์„ )
3. ๋ฌธ์ œ์—์„œ ์ œ์‹œ๋œ ๋น„์–ด์žˆ์–ด์•ผ ํ•˜๋Š” ๊ณต๊ฐ„์„ ์œ ๋…ํ•˜๋ฉด์„œ DP ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

์ „์ฒด ์ฝ”๋“œ

import java.io.*;
import java.util.*;

public class BOJ_17070{
	static int[][] map;
	static int[][][] d;
	public static void main(String[] args) throws Exception{
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(bf.readLine());
		d = new int[N][N][3]; // 0์ผ๋•Œ ๊ฐ€๋กœ, 1์ผ๋•Œ ์„ธ๋กœ, 2์ผ๋•Œ ๋Œ€๊ฐ์„ 
		map = new int[N][N];
		for(int i=0; i<N; i++) {
			StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
			for(int j=0; j<N; j++)
				map[i][j] = Integer.parseInt(st.nextToken());
		}	
		for(int i=0; i<N; i++)
			for(int j=0; j<N; j++)
				for(int k=0; k<3; k++)
					d[i][j][k] = -1;
		for(int y=0; y<N; y++) {
			d[0][y][1] = 0;
			d[0][y][2] = 0;
			d[y][0][0] = 0;
			d[y][0][2] = 0;
		}
		d[0][1][0] = 1; // ํŒŒ์ดํ”„์˜ ์ฒ˜์Œ ์œ„์น˜
		System.out.println(pipe_ver(N-1, N-1)+pipe_hor(N-1, N-1)+pipe_dia(N-1, N-1));
	}
	static int pipe_ver(int x, int y) {
		if(x < 0 || y < 0) return 0;
		if(d[x][y][0] != -1) return d[x][y][0];
		if(map[x][y] == 0) {
			return d[x][y][0] = pipe_ver(x, y-1) + pipe_dia(x, y-1);
		}
		return 0;
	}
	static int pipe_hor(int x, int y) {
		if(x < 0 || y < 0) return 0;
		if(d[x][y][1] != -1) return d[x][y][1];
		if(map[x][y] == 0) {
			return d[x][y][1] = pipe_hor(x-1, y) + pipe_dia(x-1, y);
		}
		return 0;
		
	}
	static int pipe_dia(int x, int y) {
		if(x < 0 || y < 0) return 0;
		if(d[x][y][2] != -1) return d[x][y][2];
		if(map[x][y] == 0 && map[x-1][y] == 0 && map[x][y-1] == 0) {
			return d[x][y][2] = pipe_dia(x-1, y-1)+pipe_hor(x-1, y-1)+pipe_ver(x-1, y-1);
		}
		return 0;
	}
}

DP ํ…Œ์ด๋ธ”์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ง€ ๊ฒฐ์ •ํ–ˆ์œผ๋ฉด ๋ชจ๋“  DP๊ฐ€ ๊ทธ๋ ‡๋“ฏ ํ’€์ด๋Š” ์–ด๋ ต์ง€ ์•Š๋‹ค!

ํ•œ ์ค„ ์”ฉ ์‚ดํŽด๋ณด์ž!

for(int i=0; i<N; i++)
		for(int j=0; j<N; j++)
			for(int k=0; k<3; k++)
				d[i][j][k] = -1;
	for(int y=0; y<N; y++) {
		d[0][y][1] = 0;
		d[0][y][2] = 0;
		d[y][0][0] = 0;
		d[y][0][2] = 0;
	}
d[0][1][0] = 1;
System.out.println(pipe_ver(N-1, N-1)+pipe_hor(N-1, N-1)+pipe_dia(N-1, N-1));

๊ฐ’์ด ์ €์žฅ๋˜์ง€ ์•Š์€ ๊ฒƒ๋“ค์€ -1๋กœ ์„ธํŒ…ํ•ด์ค€๋‹ค.

๋˜ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’๋“ค๋„ 0์œผ๋กœ ์„ธํŒ…ํ•˜๊ณ  ์ดˆ๊ธฐ๊ฐ’์„ ์ค€๋‹ค.

์ •๋‹ต์€ ๊ฐ€๋กœ, ์„ธ๋กœ, ๋Œ€๊ฐ์„ ์œผ๋กœ ๋†“์ธ ๊ฒƒ๋“ค์˜ ํ•ฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋”ํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.

static int pipe_ver(int x, int y) {
	if(x < 0 || y < 0) return 0;
	if(d[x][y][0] != -1) return d[x][y][0];
	if(map[x][y] == 0) {
		return d[x][y][0] = pipe_ver(x, y-1) + pipe_dia(x, y-1);
	}
	return 0;
}

์ด ํ•จ์ˆ˜๋Š” x, y๋ฅผ ํŒŒ์ดํ”„์˜ ๋์œผ๋กœ ํ•˜๋ฉด์„œ ๊ฐ€๋กœ๋กœ ๋†“์ธ ์ƒํƒœ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์˜ ํšŸ์ˆ˜๋ฅผ returnํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด (x, y)๊ฐ€ ๋ฒฝ์ธ ๊ฒฝ์šฐ์— ํŒŒ์ดํ”„๋ฃฐ ๋†“์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๊ฒฝ์šฐ 0์„ return ํ•œ๋‹ค.

๋ฒฝ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์™ผ์ชฝ ์ž๋ฆฌ๋ฅผ ๋์œผ๋กœ ํ•˜๋Š” ๊ฐ€๋กœ, ๋Œ€๊ฐ์„  ํŒŒ์ดํ”„๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ๊ฐœ์ˆ˜ ํ•ฉ์„ ์ €์žฅํ•˜๊ณ  returnํ•œ๋‹ค.

๋‚˜๋จธ์ง€ ๋‘ ํ•จ์ˆ˜๋„ ์œ„์˜ ํ•จ์ˆ˜์™€ ๋น„์Šทํ•˜๋‹ค.
Comments