๐ฏ ์๊ณ ๋ฆฌ์ฆ/๋ฐฑ์ค
[๋ฐฑ์ค] ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ
by hossii
2024. 11. 18.
1. ๋ฌธ์ ์์ฝ
- N x M ํ๋ ฌ๋ก ํํ๋๋ ์ง๋๊ฐ ์๊ณ , ๊ฐ ์ขํ๋ 0๊ณผ 1๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- 0: ์ด๋ํ ์ ์๋ ๊ณณ
- 1: ์ด๋ํ ์ ์๋ ๋ฒฝ
- ์ํ์ข์ฐ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์์ผ๋ฉฐ, ์ด๋ํ๋ ์ค์ ๋จ ํ ๋ฒ๋ง ๋ฒฝ์ ๋ถ์๊ณ ์ด๋ํ ์ ์์ต๋๋ค.
- (1, 1)์์ ์์ํด (N, M)๊น์ง ๊ฐ๊ณ ์ ํ ๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์
๋๋ค.
์
๋ ฅ ํ๋ผ๋ฏธํฐ
๋ฐํ ํ์
์์
- N: 6
- M: 4
- map
- 0100
- 1110
- 1000
- 0000
- 0111
- 0000
์ฃผ์ ์ฌํญ
- ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ก BFS๋ฅผ ์ฌ์ฉํด ํ ์ ์์ต๋๋ค.
- ๋จ, ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ ๋ ๋ฒฝ์ ๋ถ์๋์ง ์ฌ๋ถ๋ฅผ ํจ๊ป ๊ณ ๋ คํด์ค์ผ ํฉ๋๋ค.
2. ๋ฌธ์ ํ์ด
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.Queue;
public class Main {
public static void main(String[] args) throws IOException {
try (
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
) {
String[] NM = br.readLine().split(" ");
int ROW = Integer.parseInt(NM[0]);
int COL = Integer.parseInt(NM[1]);
int[][] map = new int[ROW + 1][COL + 1];
boolean[][][] isVisited = new boolean[ROW + 1][COL + 1][2];
for (int row = 1; row <= ROW; row++) {
char[] rowValues = br.readLine().toCharArray();
for (int col = 1; col <= COL; col++) {
map[row][col] = Character.getNumericValue(rowValues[col - 1]);
}
}
int result = findShortestDistance(map, isVisited, ROW, COL);
bw.write(String.valueOf(result));
}
}
private static int findShortestDistance(int[][] map, boolean[][][] isVisited, int ROW, int COL) {
Node node = new Node();
int[] dRow = {1, 0, -1, 0};
int[] dCol = {0, 1, 0, -1};
Queue<Node> queue = new ArrayDeque<>();
queue.offer(node);
isVisited[node.row][node.col][node.cheatCount] = true;
while (!queue.isEmpty()) {
Node cur = queue.poll();
if (cur.row == ROW && cur.col == COL) {
return cur.distance;
}
if (map[cur.row][cur.col] == 0) {
for (int i = 0; i < 4; i++) {
int row = cur.row + dRow[i];
int col = cur.col + dCol[i];
if (isInBound(row, col, ROW, COL) && !isVisited[row][col][cur.cheatCount]) {
queue.offer(new Node(row, col, cur.distance + 1, cur.cheatCount));
isVisited[row][col][cur.cheatCount] = true;
}
}
} else {
for (int i = 0; i < 4; i++) {
int row = cur.row + dRow[i];
int col = cur.col + dCol[i];
if (cur.cheatCount == 0 && isInBound(row, col, ROW, COL) && !isVisited[row][col][0]) {
queue.offer(new Node(row, col, cur.distance + 1, 1));
isVisited[row][col][1] = true;
}
}
}
}
return -1;
}
private static boolean isInBound(int row, int col, int ROW, int COL) {
return 1 <= row && row <= ROW && 1 <= col && col <= COL;
}
static class Node {
int row = 1;
int col = 1;
int distance = 1;
int cheatCount = 0;
public Node() {
}
public Node(int row, int col, int distance, int cheatCount) {
this.row = row;
this.col = col;
this.distance = distance;
this.cheatCount = cheatCount;
}
}
}
์๊ฐ ๋ณต์ก๋
- BFS ํ์์ ๋ํ ์๊ฐ๋ณต์ก๋
- DFS/BFS ์๊ฐ๋ณต์ก๋๋ `O(๋
ธ๋ ์ + ์๋ฐฉํฅ ๊ฐ์ ์)`๋ก ๊ณ์ฐํ ์ ์์ต๋๋ค.
- ์ง๋์ ๋
ธ๋ ์๋ `ROW x COL` ์ด๊ณ , ๋ฒฝ์ ๋ถ์๋์ง์ ๋ํ ๊ฒฝ์ฐ์ ์๋ `2`๊ฐ์ง์
๋๋ค. ๋ฐ๋ผ์ ์ด ๋
ธ๋์ ์๋ `ROW x COL x 2` ์
๋๋ค.
- ์ต๋ 4๊ฐ์ ๋ฐฉํฅ์ ๊ฒ์ฌํ ์ ์์ผ๋ฏ๋ก ๊ฐ์ ์๋ `4 x ๋
ธ๋ ์` = `8 x ROW x COL` ์
๋๋ค.
- ์๊ฐ ๋ณต์ก๋: `O(ROW X COL)`