Skip to content

Commit 627533c

Browse files
committed
[Gold III] Title: 벽 부수고 이동하기, Time: 648 ms, Memory: 166220 KB -BaekjoonHub
1 parent 348b7c9 commit 627533c

File tree

2 files changed

+127
-0
lines changed

2 files changed

+127
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# [Gold III] 벽 부수고 이동하기 - 2206
2+
3+
[문제 링크](https://www.acmicpc.net/problem/2206)
4+
5+
### 성능 요약
6+
7+
메모리: 166220 KB, 시간: 648 ms
8+
9+
### 분류
10+
11+
그래프 이론, 그래프 탐색, 너비 우선 탐색, 격자 그래프
12+
13+
### 제출 일자
14+
15+
2025년 6월 22일 20:41:31
16+
17+
### 문제 설명
18+
19+
<p>N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다.</p>
20+
21+
<p>만약에 이동하는 도중에 한 개의 벽을 부수고 이동하는 것이 좀 더 경로가 짧아진다면, 벽을 한 개 까지 부수고 이동하여도 된다.</p>
22+
23+
<p>한 칸에서 이동할 수 있는 칸은 상하좌우로 인접한 칸이다.</p>
24+
25+
<p>맵이 주어졌을 때, 최단 경로를 구해 내는 프로그램을 작성하시오.</p>
26+
27+
### 입력
28+
29+
<p>첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자.</p>
30+
31+
### 출력
32+
33+
<p>첫째 줄에 최단 거리를 출력한다. 불가능할 때는 -1을 출력한다.</p>
34+
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import java.io.BufferedReader;
2+
import java.io.InputStreamReader;
3+
import java.io.IOException;
4+
import java.util.ArrayList;
5+
import java.util.LinkedList;
6+
import java.util.Queue;
7+
import java.util.StringTokenizer;
8+
9+
public class Main {
10+
11+
static int N,M, arr[][];
12+
static int[][][] dist;
13+
static int dx[] = { -1,1, 0,0};
14+
static int dy[] = { 0,0,-1,1};
15+
public static void main(String[] args) throws IOException {
16+
17+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
18+
19+
20+
StringTokenizer st = new StringTokenizer(br.readLine());
21+
22+
N = Integer.parseInt(st.nextToken());
23+
M = Integer.parseInt(st.nextToken());
24+
25+
arr = new int[N][M];
26+
dist = new int[2][N][M];
27+
28+
for(int i =0; i<N; i++) {
29+
String input = br.readLine();
30+
for(int j =0; j <M; j++) {
31+
arr[i][j] = Integer.parseInt(input.charAt(j)+"");
32+
}
33+
}
34+
35+
bfs();
36+
37+
int notBrokenAnswer = dist[0][N-1][M-1];
38+
int brokenAnswer = dist[1][N-1][M-1];
39+
40+
if(notBrokenAnswer != 0 && brokenAnswer != 0) {
41+
if(notBrokenAnswer >= brokenAnswer) {
42+
System.out.println(brokenAnswer);
43+
}
44+
else {
45+
System.out.println(notBrokenAnswer);
46+
}
47+
}
48+
else if(notBrokenAnswer !=0) {
49+
System.out.println(notBrokenAnswer);
50+
}
51+
else if (brokenAnswer != 0) {
52+
System.out.println(brokenAnswer);
53+
}
54+
else {
55+
System.out.println(-1);
56+
}
57+
}
58+
59+
static void bfs() {
60+
61+
Queue<int []> queue = new LinkedList<>();
62+
63+
dist[0][0][0] = 1;
64+
queue.add(new int[] {0,0,0});
65+
66+
while(!queue.isEmpty()) {
67+
int now[] = queue.poll();
68+
69+
int nowx = now[0];
70+
int nowy = now[1];
71+
int broken = now[2];
72+
73+
int nowValue = dist[broken][nowx][nowy];
74+
for(int i =0; i<4; i++) {
75+
int nx = nowx + dx[i];
76+
int ny = nowy + dy[i];
77+
78+
if(nx >=0 && nx<N && ny>=0 && ny <M) {
79+
80+
if(arr[nx][ny] == 0 && dist[broken][nx][ny] == 0) {
81+
dist[broken][nx][ny] = nowValue+1;
82+
queue.add(new int[]{ nx, ny, broken});
83+
}
84+
else if(arr[nx][ny] == 1 && broken==0 && dist[1][nx][ny] == 0) {
85+
dist[1][nx][ny] = nowValue+1;
86+
queue.add(new int[]{nx,ny,1});
87+
}
88+
}
89+
}
90+
}
91+
92+
}
93+
}

0 commit comments

Comments
 (0)