๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1584
โธ ๋ฌธ์
์ธ์ค์ด๋ ์ํํ ์ง์ญ์์ ํ์ถํ๋ ๊ฒ์์ ํ๊ณ ์๋ค. ์ด ๊ฒ์์๋ ์ธ์ค์ด๊ฐ ๋ค์ด๊ฐ ์ ์๋ ์ฃฝ์์ ๊ตฌ์ญ์ด ์๊ณ , ๋ค์ด๊ฐ์ ํ ๋ฒ ์์ง์ผ ๋ ๋ง๋ค ์๋ช ์ด 1์ฉ ์๋ชจ๋๋ ์ํํ ๊ตฌ์ญ์ด ์๋ค. ๊ทธ๋ฆฌ๊ณ , ์์ ๋กญ๊ฒ ์๋ช ์ ์ํ์์ด ์์ง์ผ ์ ์๋ ์์ ํ ๊ตฌ์ญ์ด ์๋ค. (์์ ํ ๊ตฌ์ญ์ ์ฃฝ์์ ๊ตฌ์ญ๊ณผ ์ํํ ๊ตฌ์ญ์ ์ ์ธํ ๋๋จธ์ง ์ด๋ค.)
์ธ์ค์ด๋ (0, 0)์์ ์ถ๋ฐํด์ (500, 500)์ผ๋ก ๊ฐ์ผ ํ๋ค. ์ธ์ค์ด๋ ์, ์๋, ์ค๋ฅธ์ชฝ, ์ผ์ชฝ์ผ๋ก๋ง ์ด๋ํ ์ ์๋ค. ํ์ฌ ์ธ์ค์ด๋ (0, 0)์ ์๋ค. ๊ทธ๋ฆฌ๊ณ , ๊ฒ์ ํ์ ๋ฒ์ด๋ ์๋ ์๋ค.
์ธ์ค์ด๊ฐ (0, 0)์์ (500, 500)์ผ๋ก ๊ฐ ๋ ์๋ ์๋ช ์ ์ต์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ํํ ๊ตฌ์ญ์ ์ N์ด ์ฃผ์ด์ง๋ค. ๋ค์ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ X1 Y1 X2 Y2์ ๊ฐ์ ํ์์ผ๋ก ์ํํ ๊ตฌ์ญ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. (X1, Y1)์ ์ํํ ๊ตฌ์ญ์ ํ ๋ชจ์๋ฆฌ์ด๊ณ , (X2, Y2)๋ ์ํํ ๊ตฌ์ญ์ ๋ฐ๋ ๋ชจ์๋ฆฌ์ด๋ค. ๊ทธ ๋ค์ ์ค์๋ ์ฃฝ์์ ๊ตฌ์ญ์ ์ M์ด ์ฃผ์ด์ง๋ค. ๋ค์ ์ค๋ถํฐ M๊ฐ์ ์ค์๋ ์ฃฝ์์ ๊ตฌ์ญ์ ์ ๋ณด๊ฐ ์ํํ ๊ตฌ์ญ์ ์ ๋ณด์ ๊ฐ์ด ์ฃผ์ด์ง๋ค. ์ฃผ์ด์ง๋ ๊ตฌ์ญ์ ๋ชจ๋ ๊ฒน์น ์ ์์ผ๋ฉฐ, ์๋ก ๋ค๋ฅธ ๊ตฌ์ญ์ด ๊ฒน์น ๋๋, ๋ ์ฌํ ๊ตฌ์ญ์ด ํด๋น๋๋ค. ์๋ฅผ ๋ค์ด, ์ฃฝ์+์ํ = ์ฃฝ์, ์ํ+์์ = ์ํ, ์ํ+์ํ = ์ํ, ์ฃฝ์+์์ = ์ฃฝ์์ด๋ค. ์ํํ ๊ตฌ์ญ์ด ์๋ฌด๋ฆฌ ๊ฒน์ณ๋ ์๋ช ์ 1์ฉ ๊ฐ์๋๋ค. ์๋ช ์ ๊ฐ์๋ ๊ตฌ์ญ์ ๋ค์ด๊ฐ ๋๋ง, ์ํฅ์ ๋ฏธ์น๋ค. ์๋ฅผ ๋ค์ด, (500, 500)์ด ์ํํ ๊ตฌ์ญ์ผ ๋๋, (500, 500)์ ๋ค์ด๊ฐ ๋, ์๋ช ์ด 1 ๊ฐ์๋์ง๋ง, (0, 0)์ด ์ํํ ๊ตฌ์ญ์ด๋๋ผ๋ ์๋ช ์ ๊ฐ์๋์ง ์๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, (0, 0)์ด ์ฃฝ์์ ๊ตฌ์ญ์ด๋๋ผ๋ ์ธ์ค์ด๋ ์ด๋ฏธ ๊ทธ ๊ณณ์ ์์ผ๋ฏ๋ก ์ธ์ค์ด์๊ฒ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค. N๊ณผ M์ 50๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
โธ ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ ๋ต์ ์ถ๋ ฅํ๋ค. ๋ง์ฝ (500, 500)์ผ๋ก ๊ฐ ์ ์์ ๋๋ -1์ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 5
- ๐ ๋ฌธ์ ์ ํ : ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ์ต๋จ ๊ฒฝ๋ก, ๋ฐ์ดํฌ์คํธ๋ผ, 0-1 ๋๋น ์ฐ์ ํ์
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ ํ ์ ์๋ ๋ฌธ์ ์๋ค.
์ ์ฒด ๋งต์ ํฌ๊ธฐ๊ฐ 500x500์ด๊ณ , N+M์ ์ต๋์น๋ 100์ด๋ฏ๋ก O(100*500*500) = O(25,000,000)์ด๊ธฐ ๋๋ฌธ์
์ํ ๊ตฌ์ญ, ์ฃฝ์ ๊ตฌ์ญ์ ๋ํ ์ ๋ณด๋ฅผ ์ง์ ๋งต์ ๊ธฐ๋กํ๋ค.
์ฃฝ์ ๊ตฌ์ญ, ์ํ ๊ตฌ์ญ, ์์ ๊ตฌ์ญ์ด ๋ชจ๋ ์ ํด์ก์ผ๋,
๋ค์ต์คํธ๋ผ ๋๋ 0-1 ๋๋น ์ฐ์ ํ์์ ์งํํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๋์ ๊ฒฝ์ฐ๋ 0-1 ๋๋น ์ฐ์ ํ์์ ์งํํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
์ ํ์ด๋๋ก ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 23900KB
์๊ฐ : 276ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
static final int INF = 987654321;
static final int WARNING = 1;
static final int DEATH = 2;
static int[][] map;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static PriorityQueue<Pos> pq;
static public class Pos implements Comparable<Pos> {
int x; int y;
int dist;
public Pos (int x, int y, int dist) {
this.x = x; this.y = y;
this.dist = dist;
}
@Override
public int compareTo(Pos o) {
return this.dist - o.dist;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
map = new int[501][501];
int n = Integer.parseInt(br.readLine()); // ์ํํ ๊ตฌ์ญ์ ์
StringTokenizer st;
// ์ํํ ๊ตฌ์ญ์ ์ ๋ณด
int x1, y1, x2, y2;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
x1 = Integer.parseInt(st.nextToken());
y1 = Integer.parseInt(st.nextToken());
x2 = Integer.parseInt(st.nextToken());
y2 = Integer.parseInt(st.nextToken());
// ๊ตฌ์ญ ํ์
marking(x1, y1, x2, y2, WARNING);
}
int m = Integer.parseInt(br.readLine()); // ์ฃฝ์์ ๊ตฌ์ญ์ ์
// ์ฃฝ์์ ๊ตฌ์ญ์ ์ ๋ณด
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
x1 = Integer.parseInt(st.nextToken());
y1 = Integer.parseInt(st.nextToken());
x2 = Integer.parseInt(st.nextToken());
y2 = Integer.parseInt(st.nextToken());
marking(x1, y1, x2, y2, DEATH);
}
int ans = bfs();
System.out.println(ans);
}
private static void marking(int x1, int y1, int x2, int y2, int mark) {
// (x1, y1) ๊ตฌ์ญ์ ๋ชจ์๋ฆฌ, (x2, y2) ๊ตฌ์ญ์ ๋ฐ๋ ๋ชจ์๋ฆฌ
for (int i = Math.min(x1, x2); i <= Math.max(x1, x2); i++) {
for (int j = Math.min(y1, y2); j <= Math.max(y1, y2); j++) {
map[i][j] = mark;
}
}
}
private static int bfs() {
int[][] dist = new int[501][501];
for (int[] row : dist) Arrays.fill(row, INF);
pq = new PriorityQueue<>();
pq.offer(new Pos(0, 0, 0));
dist[0][0] = 0;
while (!pq.isEmpty()) {
Pos now = pq.poll();
int nowDist = now.dist;
for (int d = 0; d < 4; d++) {
int nx = dx[d] + now.x;
int ny = dy[d] + now.y;
// ๋ฒ์ ์ฒดํฌ, ์ฃฝ์์ ๊ตฌ์ญ X
if (rangeCheck(nx, ny) || map[nx][ny] == DEATH) continue;
if (dist[nx][ny] <= nowDist + map[nx][ny]) continue;
dist[nx][ny] = nowDist + map[nx][ny];
if (map[nx][ny] == 0) pq.offer(new Pos(nx, ny, nowDist)); // ์์ ํ ๊ตฌ์ญ
else pq.offer(new Pos(nx, ny, nowDist+1)); // ์ํํ ๊ตฌ์ญ
}
}
return dist[500][500] == INF ? -1 : dist[500][500];
}
private static boolean rangeCheck(int x, int y) {
return x < 0 || x >= 501 || y < 0 || y >= 501;
}
}
ํด๊ฒฐ ์๋ฃ ! ๐ฅ
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_11003] ์ต์๊ฐ ์ฐพ๊ธฐ (0) | 2024.12.17 |
---|---|
[Boj_1497] ๊ธฐํ์ฝ์ํธ (3) | 2024.12.07 |
[Boj_20160] ์ผ์ฟ ๋ฅดํธ ์์ค๋ง ์ผ์ฟ ๋ฅดํธ ์ฃผ์ธ์ (0) | 2024.11.21 |
[Boj_1464] ๋ค์ง๊ธฐ 3 (0) | 2024.07.19 |
[Boj_1238] ํํฐ (2) | 2024.03.21 |