๋ฌธ์
https://www.acmicpc.net/problem/16236
๋ฌธ์ ์ดํด
- N×N ๊ณต๊ฐ: ๋น ์นธ(0), ๋ฌผ๊ณ ๊ธฐ(1~6), ์์ด(9)
- ์์ด์ ํฌ๊ธฐ: 2.
- ์์ด๋ ์์ ์ ํฌ๊ธฐ๋ณด๋ค ์์ ๋ฌผ๊ณ ๊ธฐ๋ง ๋จน์ ์ ์๊ณ , ์์ ์ ํฌ๊ธฐ์ ๊ฐ๊ฑฐ๋ ์์ ์นธ์ ์ง๋๊ฐ ์ ์๋ค.
- ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ค.
- ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ผ๋ฉด ๊ฐ์ฅ ์(ํ์ด ์์) ๋ฌผ๊ณ ๊ธฐ
- ๊ทธ๋ค์ ๊ฐ์ฅ ์ผ์ชฝ(์ด์ด ์์) ๋ฌผ๊ณ ๊ธฐ
- ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์์ ์ ํฌ๊ธฐ๋งํผ ๋จน์ผ๋ฉด ํฌ๊ธฐ๊ฐ 1 ์ฆ๊ฐ
- ๋ ์ด์ ๋จน์ ์ ์์ ๋๊น์ง ์ด๋ํ ์ด ์๊ฐ(=์ด๋ ์นธ ์ ํฉ) ์ ๊ตฌํ๋ค.
์์ด๋์ด
- ์ต๋จ๊ฑฐ๋ฆฌ ํ์: BFS
- ๊ฑฐ๋ฆฌ → ํ → ์ด ์ฐ์ ์์: ์ฐ์ ์์ ํ
๊ตฌํ
์ํ
curSize: ํ์ฌ ์์ด ํฌ๊ธฐ(์ด๊ธฐ 2)cnt: ํ์ฌ ํฌ๊ธฐ์์ ๋จน์ ๋ฌผ๊ณ ๊ธฐ ์(ํฌ๊ธฐ๋งํผ ๋จน์ผ๋ฉด ์ฆ๊ฐ)time: ๋์ ์ด๋ ์๊ฐ- ๋ฐฉ๋ฌธ ๋ฐฐ์ด๊ณผ ํ๋ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ ๋๋ง๋ค ์ด๊ธฐํ
→ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ ํ, ๊ทธ ์๋ฆฌ์์ ๋ค์์ ๋จน์ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ํ์ํ๋ ๊ฒ์ ๋ฐ๋ณตํ๊ธฐ ๋๋ฌธ.
ํ์
- ํ์ฌ ์์น์์ 4๋ฐฉํฅ ํ์
- ๊ฒฉ์ ๋ฐ / ์ด๋ฏธ ๋ฐฉ๋ฌธ / ์์ด๋ณด๋ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ(
map[nr][nc] > curSize) ์ ๊ฑด๋๋ด๋ค. - ๋์ฐฉ ์นธ์ ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์์ผ๋ฉด(
0 < map[nr][nc] < curSize), ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ค.- ๋น ์นธ์ผ๋ก ๊ฐฑ์ :
map=0 - ๋ฌผ๊ณ ๊ธฐ๊น์ง ์ด๋ํ ์๊ฐ์ ๋์ :
time += cur.time - ํ์ฌ ์์น๋ฅผ ๊ทธ ์นธ์ผ๋ก ๊ฐฑ์ :
r = cur.rc = cur.c - ๋จน์ ๊ฐ์ ์ฆ๊ฐ:
cnt++
- ๋น ์นธ์ผ๋ก ๊ฐฑ์ :
- ๋ง์ฝ ํ์ฌ ํฌ๊ธฐ๋งํผ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์์ผ๋ฉด, ํฌ๊ธฐ ์ฆ๊ฐ:
if (cnt == curSize) curSize++
- ๊ฒฉ์ ๋ฐ / ์ด๋ฏธ ๋ฐฉ๋ฌธ / ์์ด๋ณด๋ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ(
- ๋ค์ ๋ฌผ๊ณ ๊ธฐ ํ์
- ์ฐ์ ์์ ํ๊ฐ ๋น ๋๊น์ง ๋จน์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์์ผ๋ฉด, ๋์ด์ ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์์ผ๋ฏ๋ก ์ข ๋ฃ
์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
static class Point {
int r, c, time;
public Point(int r, int c, int time) {
this.r = r;
this.c = c;
this.time = time;
}
}
static int n;
static int[][] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
map = new int[n][n];
int curR = 0, curC = 0;
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
if (map[i][j] == 9) {
curR = i;
curC = j;
map[i][j] = 0;
}
}
} // ์
๋ ฅ ๋
System.out.println(bfs(curR, curC));
}
static int bfs(int r, int c) {
int time = 0, cnt = 0, curSize = 2; // ์ด ์๊ฐ, ๋จน์ ๋ฌผ๊ณ ๊ธฐ ์, ํ์ฌ ์์ด ํฌ๊ธฐ
int[] dr = { -1, 1, 0, 0 };
int[] dc = { 0, 0, -1, 1 };
while (true) {
PriorityQueue<Point> pq = new PriorityQueue<>(
(p1, p2) -> p1.time != p2.time ? Integer.compare(p1.time, p2.time)
: (p1.r != p2.r ? Integer.compare(p1.r, p2.r) : Integer.compare(p1.c, p2.c)));
boolean[][] visited = new boolean[n][n];
boolean eat = false; // ๋จน์๋์ง ์ฌ๋ถ
pq.offer(new Point(r, c, 0));
visited[r][c] = true;
while (!pq.isEmpty()) {
Point cur = pq.poll();
if (map[cur.r][cur.c] != 0 && map[cur.r][cur.c] < curSize) { // ๋ฌผ๊ณ ๊ธฐ ๋จน์ ์ ์์
map[cur.r][cur.c] = 0;
time += cur.time;
r = cur.r;
c = cur.c;
eat = true;
cnt++;
break;
}
for (int i = 0; i < 4; i++) {
int nr = cur.r + dr[i];
int nc = cur.c + dc[i];
if (nr < 0 || nc < 0 || nr >= n || nc >= n || visited[nr][nc] || map[nr][nc] > curSize)
continue;
pq.offer(new Point(nr, nc, cur.time + 1));
visited[nr][nc] = true;
}
}
if (!eat)
break;
if (cnt == curSize) {
cnt = 0;
curSize++;
}
}
return time;
}
}
'๐ญ Problem Solving > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [BOJ][Java] 21608. ์์ด ์ด๋ฑํ๊ต (3) | 2025.10.21 |
|---|---|
| [BOJ][Java] 20056. ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด๋ณผ (0) | 2025.10.15 |
| [BOJ][Java] 2533. ์ฌํ๋ง ์๋น์ค(SNS) (0) | 2025.09.24 |
| [BOJ][Java] 15486. ํด์ฌ 2 (0) | 2025.09.15 |
| [BOJ][Java] 16930. ๋ฌ๋ฆฌ๊ธฐ (4) | 2025.09.09 |