https://www.acmicpc.net/problem/14503
14503๋ฒ: ๋ก๋ด ์ฒญ์๊ธฐ
์ฒซ์งธ ์ค์ ๋ฐฉ์ ํฌ๊ธฐ $N$๊ณผ $M$์ด ์ ๋ ฅ๋๋ค. $(3 \le N, M \le 50)$โ ๋์งธ ์ค์ ์ฒ์์ ๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ์๋ ์นธ์ ์ขํ $(r, c)$์ ์ฒ์์ ๋ก๋ด ์ฒญ์๊ธฐ๊ฐ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ $d$๊ฐ ์ ๋ ฅ๋๋ค. $d$๊ฐ $0$์ธ ๊ฒฝ์ฐ ๋ถ์ชฝ
www.acmicpc.net
1. ๋ฌธ์
NxMํฌ๊ธฐ์ ๋งต์์ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง๊ฒ ๋ก๋ด์ฒญ์๊ธฐ๊ฐ ์ด๋ํ๋ค.
๋ก๋ด์ฒญ์๊ธฐ๊ฐ ์๋์ ๋ฉ์ถ ๋๊น์ง ์ฒญ์ํ๋ ์นธ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
[์กฐ๊ฑด]
1. ํ์ฌ์นธ ์ฃผ๋ณ 4์นธ ํ์ ์ (๋ฐ๋ณต)
- ํ์ฌ ๋ฐฉํฅ ๊ธฐ์ค ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์
- ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ๊ธฐ์ค์ผ๋ก ์ ์นธ์ด ๋น์ด์์ผ๋ฉด ์ ์นธ์ผ๋ก ์ ์งํ๋ค.
2. ์ฃผ๋ณ 4์นธ ๋ชจ๋ ๊ฐ ์ ์๋ ๊ฒฝ์ฐ
- ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ์ ์งํ ์ฑ ํ ์นธ ํ์ง ํ ์ฌํ์
- ํ ์นธ ํ์งํ๋ฉด ๋ฒฝ์ธ ๊ฒฝ์ฐ ๋ก๋ด์ฒญ์๊ธฐ ์๋ ๋ฉ์ถค.
2. ํ์ด
dfs๋ก ํ์๋ค.
์ฃผ์ํ ์ ์ 3๊ฐ์ง์ด๋ค.
1. ๋ฐฉํฅ
2. return
3. ํ์ง
1.๋ฐฉํฅ
๋ฐฉํฅ์ ๋ฌธ์ ์์ ๋ถ->๋->๋จ->์ ์์๋ก 0123์ผ๋ก ์ค์ ํด์ฃผ์๋ค.
ํ์ง๋ง ํจ์ ์ธ๊ฒ, ํ์ฌ ๋ฐฉํฅ ๊ธฐ์ค์ผ๋ก ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํ ๋ฐฉํฅ์ ํ์ํด์ผ ํ๋ค.
๊ทธ๋์ 4๋ฒ ๋ฐ๋ณตํ์ง๋ง ์ค์ ๋ก ๋ณด๋ ๋ฐฉํฅ์ (์์๋ฐฉํฅ+3)%4 ๋ก ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํ ๋ฐฉํฅ์ ๋ณธ๋ค.
=> 4๋ฒ ๋ฐ๋ณตํ๋ ์ด์ ๋ ๋งค ํด๋ง๋ค ๊ฐฑ์ ๋ ๋ฐฉํฅ ๊ธฐ์ค์ผ๋ก ๋ฐ์๊ณ๋ฐฉํฅ 90๋๋ก ๋ ๊ฐฑ์ ์ด ๋์ด 4๋ฒ ๋ฐ๋ณตํ๋ฉด ๋ชจ๋ ๋ฐฉํฅ์ ๋ณด๊ฒ ๋๋ค.
2. return
4๋ฐฉํ์ ์ค return ํด์ฃผ์ง ์์ผ๋ฉด ๋ฌธ์ ์กฐ๊ฑด์ ๋ง๋ ๋ฐฉํฅ๋๋ก dfs ํด์คฌ๋ค๊ฐ dfs ๋ค ๋๋๊ณ ๋์์ค๋ ๊ธธ์
return์ด ์๋์ด์์ด์ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ์๊ฒ ๋๋ค. ๋๋ฌธ์ ๋ค๋ฅธ ๋ฐฉํฅ์ ๋ณด์ง ์์๋ ๋๋ฏ๋ก return์ ํด์ค๋ค.
3. ํ์ง
๊ทธ๋ฆฌ๊ณ 4๋ฐฉํ์ํ๋ for๋ฌธ์ด ๋๋๊ณ ๋ค์ ์ค๋ก ๋์ด์๋ค๋ ๊ฑด 4๋ฐฉ์ด ๋ค ์ฐจ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ์ด์ ํ์ง์ ํด์ค์ผ ํ๋ค.
ํ์งํ๋ ๋ฐฉํฅ์ ์ ์ผ ์ต๊ทผ์ ๊ฐฑ์ ๋ ๋ฐฉํฅ์ ๊ธฐ์ค์ผ๋ก ๋ฐ๋๋ฐฉํฅ์ผ๋ก dy, dx๋ฅผ ๋ํ ์ขํ๋ก ์ด๋ํ๋ค.
๋จ, ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ๊ฐฑ์ ๋ ๋ฐฉํฅ ๊ทธ๋๋ก ๋ณธ๋ค. ์ด๋๋ง ๋ฐ๋๋ฐฉํฅ์ผ๋ก ํด์ค๋ค.
๋ฐ๋๋ฐฉํฅ = (๊ฐฑ์ ๋ ํ์ฌ ๋ฐฉํฅ + 2) % 4
3. ์ฝ๋
package BOJ;
import java.io.*;
import java.util.*;
public class BOJ_14503_๋ก๋ด์ฒญ์๊ธฐ {
static int[][] map, visited;
static int N, M, ans, sy, sx, sd;
static int[] dy = {-1,0,1,0}; //๋ถ๋๋จ์
static int[] dx = {0,1,0,-1};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); //์ธ๋ก
M = Integer.parseInt(st.nextToken()); //๊ฐ๋ก
map = new int[N][M];
visited = new int[N][M];
st = new StringTokenizer(br.readLine());
sy = Integer.parseInt(st.nextToken());
sx = Integer.parseInt(st.nextToken());
sd = Integer.parseInt(st.nextToken());
for (int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for (int j=0; j<M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
ans = 1;
dfs(sy, sx, sd);
System.out.println(ans);
}
static void dfs(int sy, int sx, int sd) {
visited[sy][sx] = 1;
for (int d=0; d<4; d++) {
sd = (sd+3) % 4; //ํ์ฌ ๋ฐฉํฅ ๊ธฐ์ค ๋ฐ์๊ณ๋ฐฉํฅ 90๋ ํ์ -> ๋งค ํด๋ง๋ค ๋ฐ๋ -> ๊ฒฐ๊ตญ ํ ๋ฐํด
int ny = sy+dy[sd];
int nx = sx+dx[sd];
if (ny<0 || ny>=N || nx<0 || nx>=M || map[ny][nx]==1 || visited[ny][nx]==1) continue;
ans++;
visited[ny][nx] = 1;
dfs(ny, nx, sd);
return; //๋ฆฌํดํด์ฃผ์ง ์์ผ๋ฉด dfs ๋๋๊ณ ๋ค์ ๋์์ค๋ฉด์ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ์๊ฒ ๋๋ค.
}
//๋ค ๋ฐฉํฅ ๋ชจ๋ ์ฒญ์ํ์ ๋ ํ์ฌ์ง์ ์์ ํ์ง
int bd = (sd+2) % 4;
int by = sy+dy[bd];
int bx = sx+dx[bd];
if (by>=0 && by<N && bx>=0 && bx<M && map[by][bx]!=1) {
dfs(by, bx, sd);
}
}
}
4. ์ฌ๋ด
๊ฐ์ ๋์ฐพ์
์๊ณ ๋ฆฌ์ฆ ์ฌ๋ฐ๋ค..
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 13458 ์ํ๊ฐ๋ - Java (0) | 2023.09.13 |
---|---|
[BOJ] 14501 ํด์ฌ - Java (0) | 2023.06.01 |
[BOJ] 21921 ๋ธ๋ก๊ทธ - Java (0) | 2023.05.12 |
[BOJ] 20055 ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์์ ๋ก๋ด - Java (1) | 2022.12.16 |
[BOJ] 12100 2048(Easy) - Java (0) | 2022.11.13 |