BOJ_S2_10164
๐ [S2_10164] ๊ฒฉ์์์ ๊ฒฝ๋ก
package BOJ;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class BOJ_S2_10164 {
static int N, M, O;
static int ox, oy;
// ์ด๋
static int[] dx = {1, 0};
static int[] dy = {0, 1};
static int[][] map;
static int cnt;
static ArrayList<Integer> list;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// input
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
O = Integer.parseInt(st.nextToken());
// map
map = new int[N][M];
// map์ ์ ๋ฃ์ด์ฃผ๊ธฐ
int num = 1;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
map[i][j] = num;
// ๋๊ทธ๋ผ๋ฏธ ์ขํ ์ ์ฅ
if (O != 1 && num == O) {
ox = j;
oy = i;
}
num++;
}
}
list = new ArrayList<>();
// ์ ์ฒด ํ์ ์นด์ดํ
cnt = 0;
// ๋ง์ฝ O๊ฐ 0์ด๋ฉด ๋ชจ๋ ๊ฒฝ์ฐ์์ ๊ตฌํด์ฃผ๋ฉด ๋๋ค
if (O == 0) {
// ํญ์ ํฌํจํ๋ ์ ( ๋์ฐฉ์ง )
O = M * N;
}
// dfs ์คํ
dfs(0, 0);
System.out.println(cnt);
}
public static void dfs(int x, int y) {
// ๊ธฐ์ ์กฐ๊ฑด ( ๋ง์ง๋ง ๊ฐ์ ๋์ฐฉ )
if (x == M - 1 && y == N - 1) {
// ๋ง์ฝ ๋ฆฌ์คํธ์ O๊ฐ ์์ ๊ฒฝ์ฐ ์นด์ดํ
if (list.contains(O)) {
cnt++;
}
return;
}
// ์ด๋
for (int i = 0; i < 2; i++) {
int nx, ny;
nx = dx[i] + x;
ny = dy[i] + y;
// ๋จผ์ ๋ฒ์๋ฅผ ๋์ผ๋ฉด ํต๊ณผ
if (ny < 0 || ny >= N || nx < 0 || nx >= M) continue;
// ๋ง์ฝ ๋๊ทธ๋ผ๋ฏธ ์ขํ๋ณด๋ค ์์ด๊ฑฐ๋ ๋ฐ์ ์์ผ๋ฉด ํต๊ณผ -> ๊ฐ ํ์๊ฐ ์๋ค
if ((nx < ox && ny > oy) || (nx > ox && ny < oy)) continue;
// ๋ฆฌ์คํธ์ ๊ฐ ๋ฃ๊ธฐ
list.add(map[ny][nx]);
// dfs ์คํ
dfs(nx, ny);
// ๋ฐฑํธ๋ํน ( ๋งจ ๋ค์ ๊ฒ ๋นผ์ฃผ๊ธฐ )
list.remove(list.size() - 1);
}
}
}
๐ค ๋์ ์๊ฐ
์๋ธํ์คํฌ๊ฐ ์๋ ๋ฌธ์ ๋ผ ์๊ฐ์ด ์ข ํ์ํ๋ ๊ฒ ๊ฐ๋ค.
๊ณํ์ DFS๋ฅผ ํ์ฉํ์ฌ ์์ ํ์์ ํด์ฃผ๊ณ ์์ ํ์์ ํ๋ฉด์ ์ขํ๊ฐ๋ค์ List์ ๋ด์์ ๋ง์ง๋ง ์ขํ์ ๋์ฐฉํ์ ๋ List์ ๋๊ทธ๋ผ๋ฏธ ์ขํ๊ฐ์ด ์๋์ง ํ์ธํด์ ์์ผ๋ฉด ์นด์ดํ
์ ํด์ค๋ค.
์ด ๋ฌธ์ ์ ํฌ์ธํธ๋ ๋๊ทธ๋ผ๋ฏธ ์ขํ๋ณด๋ค ์์ด๊ฑฐ๋ ๋ฐ์ ์์ผ๋ฉด ํต๊ณผ ๋ถ๊ธฐ ์ฒ๋ฆฌํด์ฃผ๋ ๊ฒ์ด ์ค์ํ๋ค. ( ์๊ฐ ๋๋ฌธ์ ) -> 97๋ฒ ์ค
๋๋ ์ฒ์๋ถํฐ ์ด๊ฒ ๋ฌธ์ ์ผ ๊ฒ ๊ฐ์ ๊ณ ๋ คํด์ ๋ฌธ์ ๋ฅผ ํ์ด์ฃผ์๋ค.
- ๋จผ์ ๊ฐ์ ์ ๋ ฅ๋ฐ์ map์ ์์ฑ์ํค๊ณ ์์ ์ซ์๋ฅผ ์์๋๋ก ๋ฃ์ด์ค๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋๊ทธ๋ผ๋ฏธ๊ฐ ์๋ ์ขํ๋ฅผ ๋ฐ๋ก ์ ์ฅํ๋ค.
- ์ฒ์ (0,0) ๋ถํฐ ์์ํด์ (N-1,M-1)์ ๋์ฐฉํ ๋ ๊น์ง dfs๋ฅผ ์คํํ๋ค.
- ๋ค์ ์ขํ๋ก ๊ฐ๊ธฐ ์ ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ , ๋๊ทธ๋ผ๋ฏธ๋ณด๋ค (y๊ฐ์ด ์๊ณ x๊ฐ์ ํฐ ๊ฒฝ์ฐ), (y๊ฐ์ด ํฌ๊ณ x๊ฐ์ ์์ ๊ฒฝ์ฐ) ์ธ ๊ฒฝ์ฐ์๋ ๊ฐ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ continue๋ฅผ ํตํด ํต๊ณผํ๋ค.
- ์กฐ๊ฑด์ ํต๊ณผํ ์ขํ๊ฐ์ list์ ๋ด์์ค๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ dfs ํธ์ถ ( ์ขํ ์ด๋ )
- ๋ง์ง๋ง ๋ชฉํ ์ขํ์ ๋์ฐฉํ๋ฉด list๋ฅผ ํ์ธํด์ ๋๊ทธ๋ผ๋ฏธ ๊ฐ์ด ์์ผ๋ฉด ์นด์ดํ ์ ํด์ค๋ค.
- ๋ชจ๋ ์ขํ๋ฅผ ํ์ํ๋ค.
- ์ด ์นด์ดํ ํ ๊ฐ์ ์ถ๋ ฅํด์ค๋ค.