๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
2๏ธโƒฃ Java/Problem Solving

[Java Algorithm] ํŒŒ์ดํ”„ ์˜ฎ๊ธฐ๊ธฐ 1 BOJ #17070

by seolhee2750 2022. 9. 30.
๋ฌธ์ œ

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.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	static int n;
	static int memory[][];
	
	// ๊ฐ€๋กœ, ์„ธ๋กœ, ๋Œ€๊ฐ ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰
	static int[] dx = {0, 1, 1};
	static int[] dy = {1, 0, 1};
	
	public static void move(int x, int y, int type) {
		if(type == 0 || type == 1) { // ๊ฐ€๋กœ or ์„ธ๋กœ
			for(int i = 0; i < 2; i++) {
				int j = type; // ๊ฐ€๋กœ์ผ ๋•Œ๋Š” ๊ฐ€๋กœ, ์„ธ๋กœ์ผ ๋•Œ๋Š” ์„ธ๋กœ๋ฅผ ํƒ์ƒ‰
				if(i == 1) j = 2; // ๊ฐ€๋กœ, ์„ธ๋กœ ๋ชจ๋‘ ๋Œ€๊ฐ์„  ํƒ์ƒ‰ ํ•„์š”
				
				int nx = x + dx[j];
				int ny = y + dy[j];
				if(check(nx, ny, j)) {
					memory[nx][ny] += 1; // ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋ˆ„์ 
					move(nx, ny, j); // ํƒ์ƒ‰ํ•  x, y ์ขŒํ‘œ์™€ ์ƒˆ๋กญ๊ฒŒ ๋‚˜์•„๊ฐˆ ํŒŒ์ดํ”„์˜ ํƒ€์ž…
				}
			}
		} else if(type == 2) { // ๋Œ€๊ฐ
			for(int i = 0; i < 3; i++) {
				int nx = x + dx[i];
				int ny = y + dy[i];
				if(check(nx, ny, i)) {
					memory[nx][ny] += 1; // ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋ˆ„์ 
					move(nx, ny, i); // ํƒ์ƒ‰ํ•  x, y ์ขŒํ‘œ์™€ ์ƒˆ๋กญ๊ฒŒ ๋‚˜์•„๊ฐˆ ํŒŒ์ดํ”„์˜ ํƒ€์ž…
				}
			}
		}
	}
	
	public static boolean check(int x, int y, int type) {
		if(x < 0 || y < 0 || x >= n || y >= n || memory[x][y] == -1) { // ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜, ๋ฒฝ์ผ ๋•Œ
			return false;
		} 
		if(type == 2 && (memory[x-1][y] == -1 || memory[x][y-1] == -1)) { // ๋Œ€๊ฐ์„ ์ผ ๋•Œ๋Š” ๋‚˜์•„๊ฐˆ ๋ฐฉํ–ฅ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ๋„ ๋ชจ๋‘ ๋น„์–ด์žˆ์–ด์•ผ ํ•จ
			return false;
		}
		return true;
	}
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		n = Integer.parseInt(in.readLine());
		memory = new int[n][n];
		
		for(int i = 0; i < n; i++) {
			st = new StringTokenizer(in.readLine());
			for(int j = 0; j < n; j++) {
				int now = Integer.parseInt(st.nextToken());
				if(now == 1) {
					memory[i][j] = -1;
				}
			}
		}
		
		if(memory[n-1][n-1] == -1) {
			System.out.println(0);
		} else {
			memory[0][0] = 1;
			memory[0][1] = 1;
			move(0, 1, 0); // x, y์ขŒํ‘œ, ํŒŒ์ดํ”„ type
			System.out.println(memory[n-1][n-1]);
		}
	}
}

๐Ÿ‘‰ DP ๋ฌธ์ œ

  • ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ memoizationํ•˜๊ธฐ ์œ„ํ•ด memory ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ , ๋ฒฝ์ด ์žˆ์„ ๋•Œ๋Š” -1์„ ๋„ฃ์–ด ๊ตฌ๋ณ„ํ–ˆ๋‹ค.
  • ํŒŒ์ดํ”„์˜ ๋ชฉ์ ์ง€์ธ (n-1, n-1)์— ๋ฒฝ์ด ์žˆ์„ ๊ฒฝ์šฐ ์ ˆ๋Œ€ ๊ฐˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ๋ฐ”๋กœ 0์„ ์ถœ๋ ฅํ•˜๋ฉฐ ์ข…๋ฃŒํ–ˆ๋‹ค.
  • ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” memory์˜ (0, 0), (0, 1)์„ 1๋กœ ๋ฐ”๊ฟ”์ฃผ์–ด ์‹œ์ž‘์ ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋„ฃ๊ณ ,
    move ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ memoization ์žฌ๊ท€๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.
  • move๋Š” ๋‹ค์Œ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์‹œ์ž‘์ ์ด ๋  x, y ์ขŒํ‘œ์™€ ํŒŒ์ดํ”„๋ผ์ธ์˜ type์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•œ๋‹ค.
    type์€ ํŒŒ์ดํ”„์˜ ๋ฐฉํ–ฅ๊ฐ’์œผ๋กœ, ๋‚˜๋Š” ๊ฐ€๋กœ, ์„ธ๋กœ, ๋Œ€๊ฐ์„ ์„ ๊ฐ๊ฐ 0, 1, 2๋กœ ํ‘œํ˜„ํ–ˆ๋‹ค.
  • move๋Š” ์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ•ด์ฃผ์—ˆ๋Š”๋ฐ, ๋ฉ”์†Œ๋“œ๋ฅผ ํฌ๊ฒŒ ๊ฐ€๋กœ or ์„ธ๋กœ์ผ ๋•Œ์™€ ๋Œ€๊ฐ์„ ์ผ ๋•Œ๋กœ ๋‚˜๋ˆ„์—ˆ๋‹ค.
    (๋Œ€๊ฐ์„ ์ผ๋•Œ๋Š” ์ด ์„ธ ๊ณณ์„ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ฐ€๋กœ or ์„ธ๋กœ์ผ ๋•Œ๋Š” ๋‘ ๊ณณ์„ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ)
  • ์šฐ์„  ๊ฐ€๋กœ or ์„ธ๋กœ์ผ ๋•Œ๋Š”, for๋ฌธ์„ ์ด์šฉํ•˜์—ฌ 2๋ฒˆ ๋ฐ˜๋ณตํ•˜๋„๋ก ํ–ˆ๋Š”๋ฐ,
    for๋ฌธ ์•ˆ์—์„œ j๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ type์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด์•˜๋‹ค.
  • ๋‚˜๋Š” dx, dy ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ์ฃผ๋ณ€ ํƒ์ƒ‰์„ ์šฉ์ดํ•˜๊ฒŒ ํ–ˆ๋Š”๋ฐ,
    type์ด 0, 1, 2 ์ˆซ์ž ์ˆœ์„œ๋Œ€๋กœ ๊ฐ€๋กœ, ์„ธ๋กœ, ๋Œ€๊ฐ์„ ์„ ์˜๋ฏธํ•˜๋„๋ก ํ•œ ๊ฒƒ์„ ์ด์šฉํ•˜์—ฌ
    dx, dy ๋ฐฐ์—ด ๋˜ํ•œ type์˜ ๊ฐ’์— ๋งž์ถฐ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ€๋กœ, ์„ธ๋กœ, ๋Œ€๊ฐ์„  ํƒ์ƒ‰์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค.
  • type์— ๋งž์ถฐ check ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ ์ ˆํ•œ์ง€๋ฅผ ํŒ๋‹จํ•˜๊ณ , ์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด
    ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ˆ„์ ํ•˜๊ณ , move๋ฅผ ์žฌ๊ท€ํ˜ธ์ถœํ•˜์—ฌ ๋‹ค์Œ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.
  • memory ๋ฐฐ์—ด์˜ (n-1, n-1)์— ์ €์žฅ๋œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ฒฐ๊ณผ๋กœ ์ถœ๋ ฅํ–ˆ๋‹ค.

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ์žฌ๊ท€๋กœ ๋Œ๋ฆฌ๋‹ˆ๊นŒ ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜์—ˆ๋‹ค. ๋‹ค๋ฅธ ํ’€์ด ๋ฐฉ๋ฒ•๋„ ์ƒ๊ฐํ•ด๋ด์•ผ๊ฒ ๋‹ค.
    ๐Ÿ‘‰ https://seolhee2750.tistory.com/256 ํ•ด๊ฒฐ ์™„๋ฃŒ!

๋Œ“๊ธ€