https://www.acmicpc.net/problem/2178
โ๏ธ ๋ฌธ์
๐ ๋ฌธ์ ํด๊ฒฐ
์ด ๋ฌธ์ ๋ ์ด์ ์ ํ์๋, ๊ทธ๋ฆผ ๋ฌธ์ ์ฒ๋ผ ํ๋ฉด ์๋๋ค. ์ด์ ๋ฌธ์ ์ฒ๋ผ ํ๊ฒ ๋๋ฉด ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ์ง ๋ชปํ๋ค.
๊ทธ๋์ ์ด ๋ฌธ์ ๋ ์์์ง์ (0,0)์ผ๋ก ๋ถํฐ์ ๋ชจ๋ ์นธ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ์ฌ ๋ ๋ค๋ฅธ ๋ฐฐ์ด์ ์ ์ฅ์ ํ ๊ฒ์ด๋ค.
์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๋ฉด, ์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด
์ฐ๋ฆฌ๊ฐ ๊ตฌํด์ผ ํ๋ ๊ฒฝ๋ก๋ ๋นจ๊ฐ์ ๊ฒฝ๋ก์ธ๋ฐ, ์ด๋ป๊ฒ ๊ตฌํ๋๋ฉด ์์์ ๋งํ๋ฏ์ด ์์์ ์ผ๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ ๋ฐฐ์ด์ ์์ฑํด์ค๊ฒ์ด๋ค.
int[][] dist = new int[N][M]; // ์์์ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ 2์ฐจ์ ๋ฐฐ์ด
์ด์ ์์์ ์์ ๋ถํฐ ์ถ๋ฐํ์ฌ 1์ธ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ์ฌ dist๋ฐฐ์ด์ ๋ฃ์ด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค!
์์์ ์ (0,0) ์ผ๋ก ๋ฏธ๋ฆฌ ํ์ ๋ฃ์ด์ค ์ํ์์ ์ํ์ข์ฐ์ ๊ฐ์ด 1์ธ์ง ์๋์ง ์ฒดํฌํ๋ฉด ๋๋ค.
๊ฑฐ๋ฆฌ ๊ณ์ฐ์ ํ ๋์๋, ์ด์ ์์์ ์ + 1 ๋ง ํด์ฃผ๋ฉด ๋๋ค. ์๋ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
qu.offer(new Pair(0,0)); // ์์์
dist[0][0] = 0; // ์ฒซ ์์์ด๋๊น ๊ฑฐ๋ฆฌ๊ฐ 0์ด๋ค.
while(!qu.isEmpty()){
Pair p = qu.poll();
// ์, ํ, ์ข, ์ฐ๋ฅผ ๊ณ์ฐํด์ค๋ค.
for(int i=0; i<4; i++){
int nX = p.x + dx[i];
int nY = p.y + dy[i];
// ๋ฒฝ์ ๋ถ๋ชํ๊ฑฐ๋, ๋ฒ์๋ฅผ ๋์ด๊ฐ๋ฉด PASS
if(nX < 0 || nX >= N || nY < 0 || nY >= M){
continue;
}
// ๊ธธ์ด ์๋๊ฑฐ๋, ๋ฐฉ๋ฌธ์ ํ๋ค๋ฉด PASS
if(miro[nX][nY] == '0' || dist[nX][nY] != -1){
continue;
}
// ํ์ ์ด๋ํ ์ขํ๋ฅผ ๋ฃ์ด์ค๋ค.
qu.offer(new Pair(nX, nY));
// ํ์นธ ์ด๋ํ์๊ธฐ ๋๋ฌธ์, ์ด์ ์ถ๋ฐ์ง์ ์ ๊ฑฐ๋ฆฌ +1์ ํด์ค๋ค.
dist[nX][nY] = dist[p.x][p.y] + 1;
}
}
์ ๊ฒฝ๋ก๋ฅผ ํ๋ํ๋ ๊ณ์ฐํด์ฃผ๋ฉด ์๋์ ๊ทธ๋ฆผ์ฒ๋ผ ๋์ค๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ์๋ฌธ์ ์ด ๋๋ ์ ์ ์ต์ฅ๊ฒฝ๋ก์ผ ๋์ 15๊ฐ ์ ์ฅ์ด ๋ ์๋ ์๋๊ฑฐ ์๋๊ฐ? ๋ผ๊ณ ์๊ฐํ ์ ์๋๋ฐ, ํ์์ ์๋ก์ ๊ฒฝ๋ก๋ฅผ ํ๋์ฉ ๋ฃ๊ณ ๋นผ๊ณ ํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ์ ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒฝ๋ก๊ฐ ๋จผ์ ๋๋ฌํ์ฌ ๋ฐฐ์ด์ ๊ฐ์ ๋ฃ๊ฒ ๋๋ค. ๊ทธ๋ ๊ฒ ๋๊ธฐ ๋๋ฌธ์ ์ค๋ ๊ฑธ๋ฆฐ ๊ฒฝ๋ก๋ ๋ฐฐ์ด์ ๊ฐ์ ๋ฃ์ผ๋ ค๊ณ ํด๋ ์ด๋ฏธ ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ฃ์ง ๋ชปํ๊ฒ ๋๋ ๊ฒ์ด๋ค! ์๋ ์กฐ๊ฑด์ฒ๋ผ ๋ง์ด๋ค.
// ๊ฑฐ๋ฆฌ ๊ณ์ฐํ๋ ๋ฐฐ์ด(dist)์ -1๋ก ๊ฐ์ ์ธํ
ํด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ๊ฐ์ด ์๋ค๋ฉด PASS!
if( miro[i][j] == 0 || dist[i][j] != -1 ){
continue;
}
๐ฅ ์ ์ฒด ์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
char[][] miro = new char[N][M]; // ๋ฏธ๋ก๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
int[][] dist = new int[N][M]; // ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ dist ๋ฐฐ์ด
int[] dx = {1, 0 , -1, 0}; // ์ํ์ข์ฐ ๊ณ์ฐํ x์ขํ
int[] dy = {0, 1, 0, -1}; // ์ํ์ข์ฐ ๊ณ์ฐํ y์ขํ
Queue<Pair> qu = new LinkedList<>();
for(int i=0; i<N; i++){
String line = bf.readLine();
for(int j=0; j<M; j++){
miro[i][j] = line.charAt(j);
dist[i][j] = -1; // ๊ฑฐ๋ฆฌ๋ฅผ -1๋ก ์ธํ
ํ๋ฉด, ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ํ์ธ๊ฐ๋ฅ.
}
}
qu.offer(new Pair(0,0)); // ์์์
dist[0][0] = 0; // ์ฒซ ์์์ด๋๊น ๊ฑฐ๋ฆฌ๊ฐ 0์ด๋ค.
while(!qu.isEmpty()){
Pair p = qu.poll();
// ์, ํ, ์ข, ์ฐ๋ฅผ ๊ณ์ฐํด์ค๋ค.
for(int i=0; i<4; i++){
int nX = p.x + dx[i];
int nY = p.y + dy[i];
// ๋ฒฝ์ ๋ถ๋ชํ๊ฑฐ๋, ๋ฒ์๋ฅผ ๋์ด๊ฐ๋ฉด PASS
if(nX < 0 || nX >= N || nY < 0 || nY >= M){
continue;
}
// ๊ธธ์ด ์๋๊ฑฐ๋, ๋ฐฉ๋ฌธ์ ํ๋ค๋ฉด PASS
if(miro[nX][nY] == '0' || dist[nX][nY] != -1){
continue;
}
// ํ์ ์ด๋ํ ์ขํ๋ฅผ ๋ฃ์ด์ค๋ค.
qu.offer(new Pair(nX, nY));
// ํ์นธ ์ด๋ํ์๊ธฐ ๋๋ฌธ์, ์ด์ ์ถ๋ฐ์ง์ ์ ๊ฑฐ๋ฆฌ +1์ ํด์ค๋ค.
dist[nX][nY] = dist[p.x][p.y] + 1;
}
}
// ๋ง์ง๋ง ์ง์ ์ (๊ฑฐ๋ฆฌ + 1)๋ฅผ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
System.out.print(dist[N-1][M-1] + 1);
}
// ํ์ ์ขํ๋ฅผ ๋ฃ์ด์ฃผ๊ธฐ ์ํ ํด๋์ค
public static class Pair{
int x, y;
public Pair(int x, int y){
this.x = x;
this.y = y;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
public void setX(int x){
this.x = x;
}
public void setY(int y){
this.y = y;
}
}
}