https://www.acmicpc.net/problem/14442
๋ฌธ์
- N×M์ ํ๋ ฌ๋ก ํํ๋๋ ๋งต์ด ์๋ค. ๋งต์์ 0์ ์ด๋ํ ์ ์๋ ๊ณณ, 1์ ๋ฒฝ์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค.
- (1, 1)์์ (N, M)์ ์์น๊น์ง ์ด๋ํ๋ ค ํ๋๋ฐ, ์ต๋จ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ ค ํ๋ค.
- ํ ์นธ์์ ์ด๋ํ ์ ์๋ ์นธ์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ
- ํ ๊ฐ์ ๋ฒฝ์ ๋ถ์๊ณ ์ด๋ํ๋ ๊ฒ์ด ์ข ๋ ๊ฒฝ๋ก๊ฐ ์งง์์ง๋ค๋ฉด, ๋ฒฝ์ K๊ฐ ๊น์ง ๋ถ์๊ณ ์ด๋ํ์ฌ๋ ๋๋ค.
- ์ฒซ์งธ ์ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค. ๋ถ๊ฐ๋ฅํ ๋๋ -1์ ์ถ๋ ฅํ๋ค.
ํ์ด
๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ ์๋ฆฌ์ฆ์ ๋ฌธ์ ์ด๋ค. 1์์๋ ๋ฒฝ์ ํ ๊ฐ ๊น์ง ๋ถ์๊ณ ์ด๋ํ์ง๋ง, ์ด ๋ฌธ์ ์์๋ K๊ฐ๊น์ง ๋ถ์๊ณ ์ด๋ํ๋ค.
https://www.acmicpc.net/problem/2206
๊ทธ๋์ ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ์ ๋ฌธ์ ํ์ด์ ์ ์ฌํ๋ค.
https://programmingiraffe.tistory.com/145
์ํ์ข์ฐ ์ธ์ ํ ์นธ์ผ๋ก ํ ์นธ์ฉ ์ด๋ํ์ ๋์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ก, ํ ์นธ์ฉ ์ด๋ํ๋ฉฐ ์ฌ๋ฐฉํ์์ ํตํด ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด ์ดํผ๊ณ ๋ชฉํ ์ง์ ์ ๋๋ฌํ์์ ํ์์ ์ข ๋ฃํด์ผ ํ๋ค. ๋ฐ๋ผ์ ํ๋ฅผ ์ด์ฉํ BFS ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์๋ค.
1. ๋ฒฝ์ ์ง๊ธ๊น์ง ๋ช ๊ฐ ๋ถ์๋์ง ์ ๋ณด ์ ์ฅ
ํ์ ์ขํ ์ ๋ณด๋ฅผ ๋ฃ์ ๋, ํ๋ ฌ ์ขํ๊ฐ, ์ด๋ ๊ฑฐ๋ฆฌ๋ฟ๋ง ์๋๋ผ ์ง๊ธ๊น์ง ๋ช ๊ฐ์ ๋ฒฝ์ ๋ถ์์ ์ด ์๋์ง ์ ๋ณด๋ฅผ ์ ์ฅํ ํ์๊ฐ ์๋ค. ๋ฐ๋ผ์ ์ขํ ์ ๋ณด๋ฅผ ๋ด๋ Point๋ผ๋ ๊ฐ์ฒด์ int ํ์ ๋ณ์(hit)์ ์ถ๊ฐํด์คฌ๋ค.
2. ๋ฐฉ๋ฌธ์ฒดํฌ : boolean[K][N][M]
๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ ๋, ํค๋น ์ง์ ์ ๋ํด ์ง๊ธ๊น์ง ๋ฒฝ์ ๋ช ๋ฒ ๋ถ์๊ณ ๋ฐฉ๋ฌธํ๋๊ฐ ์ํ๋๊ฐ๋ฅผ ํ์ํ๋ค. ํด๋น ์ง์ ์ ํ๋ฒ๋ ์๋ถ์๊ณ ๋ฐฉ๋ฌธํ ์๋ ์๊ณ , 1๋ฒ ๋ถ์๊ณ ๋ฐฉ๋ฌธํ ์๋ ์๊ณ , .. K๋ฒ ๋ถ์๊ณ ๋ฐฉ๋ฌธํ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋จผ์ n๋ฒ ๋ถ์๊ณ ๋ฐฉ๋ฌธํ์ด๋ ํ์ ๊ทธ ๊ฒฝ๋ก๊ฐ ๋์ด์ ํ์์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ๋ก๊ฐ ๋ ์๋ ์๋ค.
* ๋ฐฑ์ค์ ๋ฌธ์ ๋ด ๊ฒ์ํ์์ ๋ณธ๊ฑด๋ฐ, ๋ฐฐ์ด์ ์ฐจ์ ์ ์ธ ์์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ํ์๊ฐ์ ์ํฅ์ ๋ฏธ์น๋ค๊ณ ํ๋ค.
(https://www.acmicpc.net/board/view/111938)
visited[11][1000][1000]๊ฐ visited[1000][1000][11] ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ํจ์ฌ ์ ๋ค. ์ฑ์ ์ ๋๋ ธ์ ๋๋ 500ms ์ ๋ ์ฐจ์ด๊ฐ ๋ฌ๋ค.
3. ๋ฒฝ์ธ์ง ๋ฒฝ์ด ์๋์ง์ ๋ฐ๋ผ ํ์์ ๋ค๋ฅด๊ฒ ํ๋ค.
- ๋ฒฝ์ด ์๋๋ค
- ์ง๊ธ๊น์ง n๊ฐ ๋ถ์ด ๋ฐฉ๋ฌธํ์ ์ด ์์ => n๊ฐ ๊ทธ๋๋ก ํ์
- ๋ฒฝ์ด๋ค
- ์ง๊ธ๊น์ง K๊ฐ ๋ฏธ๋ง ๋ถ์จ
- ์ง๊ธ๊น์ง n +1๊ฐ ๋ถ์ด ๋ฐฉ๋ฌธํ์ ์ด ์์=> n+1 ๋ถ์๊ณ ํ์
์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
static int N, M, K;
static int[][] graph;
static boolean[][][] visited;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static class Point {
int x;
int y;
int count;
int hit;
public Point(int x, int y, int count, int hit) {
this.x = x;
this.y = y;
this.count = count;
this.hit = hit;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
graph = new int[N + 1][M + 1];
visited = new boolean[K + 1][N + 1][M + 1]; //0 : ๋ฒฝ ์๋ถ์จ, 1~K: ๋ฒฝ n๊ฐ ๋ถ์จ
for(int i = 1; i <= N; i++) {
String row = br.readLine();
for(int j = 1; j <= M; j++) {
graph[i][j] = row.charAt(j - 1) - '0';
}
}
int answer = bfs(1, 1);
System.out.println(answer);
}
public static int bfs(int i, int j) {
Queue<Point> queue = new LinkedList<>();
queue.add(new Point(i, j, 1, 0));
visited[0][i][j] = true;
while(!queue.isEmpty()) {
Point point = queue.poll();
if(point.x == N && point.y == M) { // ์ข
๋ฃ ์กฐ๊ฑด
return point.count;
}
for(int d = 0; d < 4; d++) {
int nx = point.x + dx[d];
int ny = point.y + dy[d];
if(1 <= nx && nx <= N && 1 <= ny && ny <= M) {
if(graph[nx][ny] == 0 && !visited[point.hit][nx][ny]) { //๋ฒฝ ์๋
queue.add(new Point(nx, ny, point.count + 1, point.hit));
visited[point.hit][nx][ny] = true;
}else if(graph[nx][ny] == 1 && point.hit < K && !visited[point.hit + 1][nx][ny]) { //๋ฒฝ ์์, k๊ฐ ๋ฏธ๋ง ๋ถ์จ, n+1๋ถ์๊ณ ๋ฐฉ๋ฌธํ์ ์์
queue.add(new Point(nx, ny, point.count + 1, point.hit + 1)); //๋ฒฝ ๋ถ์๊ธฐ
visited[point.hit + 1][nx][ny] = true;
}
}
}
}
return -1;
}
}
๊ฒฐ๊ณผ
1480ms ๊ฑธ๋ฆฌ๋ ๊ฒฐ๊ณผ : visited[11][1000][1000]
1992ms ๊ฑธ๋ฆฌ๋ ๊ฒฐ๊ณผ : visited[1000][1000][11]
๋ฐฐ์ด์
- 3์ฐจ์ ๋ฐฉ๋ฌธ์ฒดํฌ
- visited[11][1000][1000] ๊ฐ visited[1000][1000][11] ๋ณด๋ค ์๊ฐ์ด ์ ๊ฒ ๋ ๋ค
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 1261๋ฒ : ์๊ณ ์คํ (0) | 2023.09.16 |
---|---|
๋ฐฑ์ค 7785๋ฒ : ํ์ฌ์ ์๋ ์ฌ๋ (0) | 2023.08.30 |
๋ฐฑ์ค 2206๋ฒ : ๋ฒฝ๋ถ์๊ณ ์ด๋ํ๊ธฐ (0) | 2023.08.30 |
๋ฐฑ์ค 16724๋ฒ : ํผ๋ฆฌ ๋ถ๋ ์ฌ๋์ด (1) | 2023.08.29 |
๋ฐฑ์ค 13460๋ฒ : ๊ตฌ์ฌ ํ์ถ2 (0) | 2023.08.02 |