๋ฌธ์
https://www.acmicpc.net/problem/17070
๋ด ๋ฌธ์ ํ์ด
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 ํด๊ฒฐ ์๋ฃ!
'2๏ธโฃ Java > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java Algorithm] RGB ๊ฑฐ๋ฆฌ 2 BOJ #17404 (0) | 2022.10.02 |
---|---|
[Java Algorithm] ํ์ดํ ์ฎ๊ธฐ๊ธฐ 2 BOJ #17069 (0) | 2022.09.30 |
[Java Algorithm] ์ธ๊ตฌ ์ด๋ BOJ #16234 (0) | 2022.09.22 |
[Java Algorithm] ์ต์ ํ์์ค ๊ฐ์ BOJ #19598 (0) | 2022.08.31 |
[Java Algorithm] ๋์ 2 BOJ #2294 (0) | 2022.08.31 |
๋๊ธ