๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/2206)
<๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ>
๋ฌธ์
N×M์ ํ๋ ฌ๋ก ํํ๋๋ ๋งต์ด ์๋ค. ๋งต์์ 0์ ์ด๋ํ ์ ์๋ ๊ณณ์ ๋ํ๋ด๊ณ , 1์ ์ด๋ํ ์ ์๋ ๋ฒฝ์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค. ๋น์ ์ (1, 1)์์ (N, M)์ ์์น๊น์ง ์ด๋ํ๋ ค ํ๋๋ฐ, ์ด๋ ์ต๋จ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ ค ํ๋ค. ์ต๋จ๊ฒฝ๋ก๋ ๋งต์์ ๊ฐ์ฅ ์ ์ ๊ฐ์์ ์นธ์ ์ง๋๋ ๊ฒฝ๋ก๋ฅผ ๋งํ๋๋ฐ, ์ด๋ ์์ํ๋ ์นธ๊ณผ ๋๋๋ ์นธ๋ ํฌํจํด์ ์ผ๋ค.
๋ง์ฝ์ ์ด๋ํ๋ ๋์ค์ ํ ๊ฐ์ ๋ฒฝ์ ๋ถ์๊ณ ์ด๋ํ๋ ๊ฒ์ด ์ข ๋ ๊ฒฝ๋ก๊ฐ ์งง์์ง๋ค๋ฉด, ๋ฒฝ์ ํ ๊ฐ ๊น์ง ๋ถ์๊ณ ์ด๋ํ์ฌ๋ ๋๋ค.
ํ ์นธ์์ ์ด๋ํ ์ ์๋ ์นธ์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ์ด๋ค.
๋งต์ด ์ฃผ์ด์ก์ ๋, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด ๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์ M๊ฐ์ ์ซ์๋ก ๋งต์ด ์ฃผ์ด์ง๋ค. (1, 1)๊ณผ (N, M)์ ํญ์ 0์ด๋ผ๊ณ ๊ฐ์ ํ์.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค. ๋ถ๊ฐ๋ฅํ ๋๋ -1์ ์ถ๋ ฅํ๋ค.
๋ฌธ์ ํ์ด
- my solution (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class _2206_ { // ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ
static int arr[][], depth[][][],n,m;
static boolean visited[][][];
static int dx[]= {-1,1,0,0};
static int dy[]= {0,0,-1,1};
public static void main(String[] args) throws IOException {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(bf.readLine());
n=Integer.parseInt(st.nextToken());
m=Integer.parseInt(st.nextToken());
arr=new int[n][m];
depth=new int[n][m][2];
visited=new boolean[n][m][2];
for(int i=0; i<n; i++) {
String s=bf.readLine();
for(int j=0; j<m; j++) {
arr[i][j]=s.charAt(j)-'0';
}
}
search();
int answer=Integer.MAX_VALUE;
if(depth[n-1][m-1][0] !=0) {
answer=depth[n-1][m-1][0];
}
if(depth[n-1][m-1][1]!=0 && answer>depth[n-1][m-1][1]) {
answer=depth[n-1][m-1][1];
}
if(answer==Integer.MAX_VALUE) answer=-1;
System.out.println(answer);
}
private static void search() {
Queue<int[]>queue=new LinkedList<>();
queue.add(new int[] {0,0,0});
depth[0][0][0]=1;
visited[0][0][0]=true;
while(!queue.isEmpty()) {
int temp[]=queue.poll();
for(int i=0; i<4; i++) {
int x=temp[0]+dx[i];
int y=temp[1]+dy[i];
if(x>=0 && x<n && y>=0 && y<m) {
if(arr[x][y]==0) {
if(!visited[x][y][temp[2]] || depth[x][y][temp[2]]>depth[temp[0]][temp[1]][temp[2]]+1) {
visited[x][y][temp[2]]=true;
depth[x][y][temp[2]]=depth[temp[0]][temp[1]][temp[2]]+1;
queue.add(new int[] {x,y,temp[2]});
}
}
if(arr[x][y]==1 && temp[2]==0) {
if(!visited[x][y][temp[2]+1] || depth[x][y][temp[2]+1]>depth[temp[0]][temp[1]][temp[2]]+1) {
visited[x][y][temp[2]+1]=true;
depth[x][y][temp[2]+1]=depth[temp[0]][temp[1]][temp[2]]+1;
queue.add(new int[] {x,y,1});
}
}
}
}
}
}
}
- Main
- n, m ์ ๋ ฅ
- arr : ๋งต ์ ๋ ฅ
- depth, visited : ๊ฒฝ๋ก ๊น์ด ์ ์ฅ, ๋ฐฉ๋ฌธ ์ฌ๋ถ ํ์
- ๋งต ์ ๋ ฅ ํ search ํจ์ ํธ์ถ
- answer : ์ต๋จ ๊ฒฝ๋ก
๋ฒฝ์ ํ๋๋ ๋ถ์์ง ์๊ณ ๋์ฐฉํ ๋์ ๋ฒฝ์ 1๊ฐ ๋ถ์๊ณ ๋์ฐฉํ๋ ๊ฒฝ์ฐ ์ค ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ์ฌ ์ ์ฅ
๋์ฐฉํ ์ ์๋ ๊ฒฝ์ฐ -1 ์ถ๋ ฅ
- search ( )
- queue๋ฅผ ์ ์ธํ์ฌ ์ด๊ธฐ ์์ ์์น ์ ์ฅ
์์ํ๋ ์นธ๋ ํฌํจ์ด๋ฏ๋ก depth (0,0)๋ฅผ 1๋ก ์ง์ ๋ฐ ๋ฐฉ๋ฌธ ํ์ - queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
- queue์์ ๊ฐ์ ๊บผ๋ด ์ํ์ข์ฐ ํ์
- map ๋ฒ์ ์์ด๋ฉฐ ๋ฒฝ์ด ์๋๋ฉฐ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๊ฑฐ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ผ๋ฉด update
- map ๋ฒ์ ์์ด๋ฉฐ ๋ฒ ์ด๊ณ ์์ง ๋ฒฝ์ ๋ถ์ ์ ์ด ์๋ค. ๋ํ, ์์ง ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉฐ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ผ๋ฉด ๋ฐฉ๋ฌธ ํ์ ๋ฐ ๋ฒฝ ๋ถ์๊ณ , update
- queue์์ ๊ฐ์ ๊บผ๋ด ์ํ์ข์ฐ ํ์
- queue๋ฅผ ์ ์ธํ์ฌ ์ด๊ธฐ ์์ ์์น ์ ์ฅ
์๊ฐ๐ค
์์ ์ ์ด ๋ฌธ์ ๋ฅผ ๋ดค์ ๋ ์ด๋ป๊ฒ ํ์ด์ผ ํ ๊น ์๊ฐํ๋ค๊ฐ ๋ชฐ๋ผ์ ๋๊ฒผ๋ ๋ฌธ์ ์๋ค.
ํ์ง๋ง '๋ง์ด ๋๊ณ ํ ์์ญ์ด' ๋ฌธ์ ๋ฅผ ์ดํดํ๋ฉด์ ์ด ๋ฌธ์ ๋ ๋๊ฐ์ ๋ฐฉ์์ผ๋ก ํ๋ฉด ๋๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
depth์ visited๋ฅผ (x์ขํ, y์ขํ, ์ฐจ์)๊ณผ ๊ฐ์ด 3์ฐจ์ ๋ฐฐ์ด๋ก ์ ์ธํ์ฌ ํธ๋ ๋ฐฉ๋ฒ์ด์๋ค.
์๋ฅผ ๋ค์ด ์ด ๋ฌธ์ ์์ depth [1][2][0]์ด๋ผ๊ณ ํ๋ฉด ์์ง ๋ฒฝ์ ๋ถ์์ง ์๊ณ (1,2) ์์น์ ๋์ฐฉํ๋ค๋ ๋ป์ด๋ค.
depth [2][3][1]์ด๋ผ๋ฉด ๋ฒฝ์ ํ๋ ๋ถ์๊ณ (2,3)๊น์ง ์๋ค๋ ๋ป์ด๋ค.
์ด๋ฐ ์์ผ๋ก ์๊ฐํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 10769_ํ๋ณตํ์ง ์ฌํ์ง (0) | 2022.12.13 |
---|---|
[Baekjoon] 18405_๊ฒฝ์์ ์ ์ผ (1) | 2022.12.12 |
[Baekjoon] 1759_์ํธ ๋ง๋ค๊ธฐ (0) | 2022.08.15 |
[Baekjoon] 1715_์นด๋ ์ ๋ ฌํ๊ธฐ (0) | 2022.08.06 |
[Baekjoon] 15649, 15650, 15651, 15652 N๊ณผ M (0) | 2022.08.03 |