๐ ๋ฌธ์
๋ฌธ์
์ฒ ์๋ค ๋๋ค์ ์๋ฐฉ์์์๋ ์ฃผ๋ฏผ๋ค์ ํธ์๋ฅผ ์ํด 119 ๊ตฌ๊ธ ๋๋ฅผ ์ด์ํ๊ณ ์๋ค. ๊ฐ๋ ์ผ์ด๋๋ ์ผ์ด์ง๋ง ์๊ธํ ์ผ์ ๋ถ์ด๋ฅผ ๋คํฌ๋ ์ผ์ด ๋ง๊ธฐ ๋๋ฌธ์ 119 ๊ตฌ๊ธ๋๊ฐ ์๊ธํ ์ผ์ด ๋ฐ์ํ ๋ชฉํ์ง์ ๊น์ง ์ต๋ํ ๋นจ๋ฆฌ ๋์ฐฉํด์ผ ํ๋ค.
119 ๊ตฌ๊ธ์ฐจ๋ ์ฑ๋ฅ์ด ์ข์ ์ผ๋ฐ ์๋์ฐจ๋ณด๋ค ์์ฃผ ๋น ๋ฅธ ์๋๋ก ์ฃผํํ ์ ์์ง๋ง ์ฝ๋๋ฅผ ๋ ๋์๋ ์ผ๋ฐ ์๋์ฐจ์ฒ๋ผ ์๋๋ฅผ ์์ ํ ์ค์ฌ์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ชฉํ์ง์ ์ ๋๋ฌํ ๋ ๊น์ง ๋๋๋ก ์ฝ๋๋ฅผ ๋์ง ์๊ณ ์ง์ ๋๋ก๋ฅผ ํตํด ๋์ฐฉํด์ผ ์๊ฐ์ ์ค์ผ ์ ์๋ค.
์์ ํ ์ด๋ธ์ 119 ๊ตฌ๊ธ ๋์์ ์๊ธํ ์ผ์ด ๋ฐ์ํ๋ ๋ชฉํ์ง์ ๊น์ง์ ์ง๋๋ฅผ ํ์ํ ๊ฒ์ด๋ค. ํฐ์์ผ๋ก ํ์๋์ด ์๋ ๋ถ๋ถ์ด ์ฐจ๊ฐ ์ง๋๊ฐ ์ ์๋ ๊ธธ์ ๋ํ๋ด๊ณ ํ์์ผ๋ก ์น ํด์ ธ ์๋ ๊ณณ์ด ์ฅ์ ๋ฌผ์ ์๋ฏธํ๋ค. ์ด์ ์๋ฐฉ์์์ ์๊ธํ ์ผ์ด ๋ฐ์ํ ๋ชฉํ์ง์ ๊น์ง ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ ๋์ฐฉํ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ์๋ณด์. (์ถ๋ฐ์ ์ ํญ์ ์ผ์ชฝ ๋งจ ์(0,0)์ด๊ณ ๋์ฐฉ์ ์ ์ขํ๋ก ์ฃผ์ด์ง๋ค. 119 ๊ตฌ๊ธ์ฐจ๋ ๊ฐ๋ก์ ์ธ๋ก ๋ฐฉํฅ์ผ๋ก๋ง ์์ง์ผ ์ ์๊ณ ๋๊ฐ์ ์ผ๋ก๋ ์์ง์ผ ์ ์๋ค.)
์ ๋ ฅํ์
์ฒซ์งธ ์ค์ ์ง๋์ ํฌ๊ธฐ M(1≤M≤100)×N(1≤N≤100)์ด ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ ์ค์๋ ๋ชฉํ์ m,n์ด ์ฃผ์ด์ง๋ค. (๋จ M=m+1, N=n+1) ๋ค์ N์ค์๋ M๊ฐ์ ๊ฐ์ด ์ฃผ์ด์ง๋ฉฐ ๊ฐ ๊ฐ์์ 1์ ๋๋ก์ด๊ณ 0์ ์ง์ ํ ์ ์๋ ๋ฌผ๊ฑด์ด ๋์ฌ ์๋ค.
์ถ๋ ฅํ์
์ฒซ์งธ ์ค์ ์ต์ ์ฝ๋๋ฅผ ๋๋ ํ์๋ฅผ ์ถ๋ ฅํ๋ค.
โ๏ธ ํ์ด
1. ์์ ์์น๋ถํฐ BFS ํ์์ ์๋ํ๋ค.
2. ์ ์ฒด ์์น์ ๊ฒฝ๋ก๊น์ง ์ค๋๋ฐ ๋ ์ฝ๋์ ํ์๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด์ ์ ์ธํ๋ค.
ํน์ ์์น๋ฅผ ์กฐํํ ๋๋ง๋ค, ํ์ฌ ์์น์ ์ฝ๋ ํ์๋ณด๋ค ์ ์ ๊ณณ์ธ์ง ํฐ ๊ณณ์ธ์ง ํ์ธํ๋ค.
์ฝ๋ ํ์๊ฐ ํ์ฌ ์์น๋ณด๋ค ์ ์ ๊ณณ๋ง ๋ฐฉ๋ฌธํ๋ค.
3. ์ฝ๋์ธ์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ ํ์ฌ ์์น์ ๋ฐฉํฅ ์ธ๋ฑ์ค์ ๋น๊ตํ๋ ๊ฒ์ด๋ค.
์ผ์ชฝ ์นธ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํด์ ํ์ฌ ์์น๋ก ์๋ค๋ฉด, ํ์ฌ ์์น์์ ์ค๋ฅธ์ชฝ์ ์๋ ์ขํ๋ง์ด ์ง์ง์ผ ๊ฒ์ด๋ค.
๋ค๋ก ๋์๊ฐ๋ ๊ฒฝ์ฐ๋ ์ฝ๋ ํ์๊ฐ ํ์ฌ์ ๊ฐ๊ฑฐ๋ ๊ทธ๋ณด๋ค ํฌ๋ฏ๋ก ๋ฌด์๋๋ค.
๋ฐ๋ผ์ ์์น๋ฅผ ํ์ ๋ฃ์ ๋๋ง๋ค, ์ด๋ค ๋ฐฉํฅ์์ ์๋์ง ์๋ ค์ฃผ๋ ๋ฐฉํฅ ์ธ๋ฑ์ค๋ฅผ ํจ๊ป ๋ฃ์ด์ค๋ค.
4. ๋ชฉํ ์์น๊ฐ ๋ํ๋๋ฉด ๋ชฉํ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ๋ ์์ ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ ํด์ค๋ค.
๋ชฉํ ์์น์ ๋๋ฌํ๋ค๊ณ ๋ฐ๋ก ์ฝ๋ ๊ฐ์ ๋ฆฌํดํ๋ฉด ์๋๋ ์ด์ ๋ ์๋์ ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ฝ (0,0)์์ ์ฃผ๋ณํ์์ ํ ๋ ํ๋ณด๋ค ์ฐ๋ฐฉํฅ์ ๋จผ์ ์ ๊ทผํ๋ค๋ฉด,
(0,0)์์ -> ์ฐ -> ํ -> ์ฐ: ์ฝ๋ ๋ ํ์ 2๋ฒ
(0,0)์์ -> ํ -> ์ฐ -> ์ฐ: ์ฝ๋ ๋ ํ์ 1๋ฒ
์ ๊ฐ์ด ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์, ๋จผ์ ๋์ฐฉํ์์๋ ์ฝ๋๋ฅผ ๋ ํ์๊ฐ ๋ ๋ง์ ์ ์๋ค.
0 | 0 | X |
0 | 1 | 2 |
๐โ๏ธ ์๊ฒฌ
BFS๋ ๋ช ๋ฒ์ ํ๊ธด ํ์ง๋ง ๊ฐ๋ ๋ฉ๋ถ์ ๋น ์ง๋ ์๊ฐ์ด ์ค๋ ๊ฒ ๊ฐ๋ค.
์ค๋์ visited ๋ฐฐ์ด์ ์ ์ธ์ ํด์ผ ํ๋์ง ๋ฉ๋ถ์ ๋น ์ก๋ค.
์ด๋ฏธ ๋ฐฉ๋ฌธํ ์์น๋ผ๋ ์ต์๊ฐ์ด ๊ฐฑ์ ๋๋ฉด ์ด์ฉ์ง?ํ๋๋ฐ ์๊ฐํด๋ณด๋ '์ฝ๋' ๋๋ ํ์๋ฅผ ๋ฐ์ง๊ธฐ ๋๋ฌธ์ ํ ๋ฒ์ด๋ผ๋ ๋ ๋ ๊ฒฝ๋ก๋ ๋ ๋ ๊ฒฝ๋ก๋ณด๋ค ํน์ ์์น์ ๋ฆ๊ฒ ๋์ฐฉํ ์ ๋ฐ์ ์๋ค. ์ฆ, ์ฒ์ ๋ฐฉ๋ฌธํ๊ฒ ๊ฐ์ฅ ์ฝ๋๋ฅผ ๋ ํ์๊ฐ ์ ์ ๊ฒ์ด ๋๊ธฐ ๋๋ฌธ์ visited๋ฅผ ์จ๋ ์ต์๊ฐ์ ์ฐพ์๋ผ ์ ์๋ค.
visited๋ฅผ ์ด ์ฝ๋๋ ์ง์๋ ๊ฒ์ ๊ฐ์ ธ์๋ค. ์ง์๋๋ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ฒ ์ ๋ง ์ ์ง์๋ ๋ฏ ํ๋ค.
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
public class Main_์ ์ฌ_1113_119๊ตฌ๊ธ๋ {
// BFS. ๋๊ธฐ์ด์ ์์น๊ฐ๊ณผ corner๊ฐ(ํ์ฌ ๋ฐฉํฅ*(1, -1)๊ณผ ๊ฐ์ง ์์ผ๋ฉด ์ฆ๊ฐ) ํจ๊ป ์ ๋ฌ
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ฐฐ์ด์ด๋ผ๋ฉด ์ฝ๋๊ฐ์ด ๋ ์์ ๋ ์ฌ์ง์
static int M, N, m, n;
static int[][] map, val;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken()); //๊ฐ๋ก
N = Integer.parseInt(st.nextToken()); //์ธ๋ก
st = new StringTokenizer(br.readLine());
m = Integer.parseInt(st.nextToken());
n = Integer.parseInt(st.nextToken());
map = new int[M][N];
val = new int[M][N];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
val[i][j] = 1000;
}
}//input
System.out.println(bfs());
}//end of main
private static int bfs() {
int[] dr = {1,-1,0,0};
int[] dc = {0,0,1,-1};
int result = Integer.MAX_VALUE;
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[] {0,0,0,-1}); //r,c,cnt,dir
val[0][0] = 0;
while(queue.size()>0) {
int[] cur = queue.poll();
int r = cur[0];
int c = cur[1];
int cnt = cur[2];
int dir = cur[3];
if(r==m && c==n) {
result = Math.min(result, cnt);
continue;
}
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
int ncnt = cnt;
if(nr<0||nc<0||nr>=M||nc>=N||map[nr][nc]==0||
val[nr][nc]<=cnt) continue;
if(dir!=-1) {
if(dir!=i) ncnt++;
}
val[nr][nc] = ncnt;
queue.offer(new int[] {nr,nc,ncnt,i});
}
}
return result;
}//bfs
}//end of class
๐ป ๋ค๋ฅธ์ฌ๋ ์์ค์ฝ๋: ์๋ฐ(Java)
public class Main_1113_119๊ตฌ๊ธ๋ {
// ์ต์ ์ฝ๋๋ฅผ ๋๋ ํ์
// bfs๋๋ฉด์ ์ฝ๋๋๋ ํ์ ์ ์ฅ - ์ํ.. ์ต์ํ์๊ฐ ์ ์ฅ๋๋ฉด ์ต์๋ณด๋ค ํฐ๊ฒฝ์ฐ ํ๋ฝ
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int m = Integer.parseInt(st.nextToken());
int n = Integer.parseInt(st.nextToken());
char[][] map = new char[m][n];
boolean[][] visited = new boolean[m][n];
st = new StringTokenizer(br.readLine(), " ");
int endX = Integer.parseInt(st.nextToken());
int endY = Integer.parseInt(st.nextToken());
for (int i = 0; i < n; i++) {
String input = br.readLine();
for (int j = 0; j < m; j++) {
map[i][j] = input.charAt(j << 1);
}
}
int[][] dir = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
// ์0 ํ1 ์ข2 ์ฐ3
Queue<int[]> q = new LinkedList<int[]>();
if (map[0][1] == '1')
q.add(new int[] { 0, 1, 3, 0 }); // r c d cnt
if (map[1][0] == '1')
q.add(new int[] { 1, 0, 1, 0 });
visited[0][0] = true;
int min = 987654321;
while (q.size() > 0) {
int[] cur = q.poll();
int cnt = cur[3];
visited[cur[0]][cur[1]] = true;
if (cur[0] == endX && cur[1] == endY) {
if (min > cnt)
min = cnt;
continue;
}
for (int i = 0; i < 4; i++) {
int nr = cur[0] + dir[i][0];
int nc = cur[1] + dir[i][1];
if (nr < 0 || nr >= m || nc < 0 || nc >= n || visited[nr][nc] || map[nr][nc] == '0')
continue;
if (i == cur[2])
q.add(new int[] { nr, nc, i, cnt });
else if (cnt + 1 < min)
q.add(new int[] { nr, nc, i, cnt + 1 });
}
}
System.out.println(min);
}
}
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ