
๋ฌธ์
๋ฌด์๋ฌด์ํ ํ
๋ฌ ๋จ์ฒด 'ํ๋ ์ ํด์กฐ๋ฅ ์ฐ์ง๋'๊ฐ ๋ถ์ฐ๋ํ๊ต์ ๋ฐ์ด๋ฌ์ค๋ฅผ ์ดํฌํ๊ฒ ๋ค๊ณ ์๊ณ ํ๋ค.
$N$ํ
$M$์ด์ ๊ฒฉ์๋ก ์ด๋ฃจ์ด์ง ๋ถ์ฐ๋ํ๊ต ์์๋
$B$๊ฐ์ ๊ฑด๋ฌผ์ด ๊ตฌ์ญ ์์ ๊ฒน์น์ง ์๊ณ ์์ผ๋ฉฐ, ๋ถ์ฐ๋ํ๊ต์ ์ฒ ํต๊ฐ์ ๋ณด์ ๋์ ํ
๋ฌ ๋จ์ฒด๊ฐ ๊ฑด๋ฌผ์๋ ๋ฐ์ด๋ฌ์ค๋ฅผ ์ดํฌํ์ง ๋ชปํ๋ค.
ํ
๋ฌ์ ์ฌ์ฉ๋ ๋ฐ์ด๋ฌ์ค๋ ์๋์ ์ธ ๊ฐ์ง ํน์ง์ด ์๋ค.
1. ๊ฑด๋ฌผ์ ๋ด๋ถ์ ์ธ๋ถ์ ์กด์ฌํ๋ ๋ชจ๋ ๋ฐ์ด๋ฌ์ค๋ ์ดํฌ ์์ ์ผ๋ก๋ถํฐ $T_{G}$์๊ฐ ๋ค ์ ํ๋ฅผ ๋ฉ์ถฐ ๋ฐ์ด๋ฌ์ค๊ฐ ๋ ์ด์ ์ฃผ๋ณ์ผ๋ก ํผ์ง์ง ์๋๋ค.
2. ๋ฐ์ด๋ฌ์ค๋ก๋ถํฐ ์์ ํ์ง ์์ ๊ตฌ์ญ๊ณผ ์ํ์ข์ฐ๋ก ์ธ์ ํ ๊ตฌ์ญ์ $1$์๊ฐ ๋ค ๋ฐ์ด๋ฌ์ค์ ์ ํ๊ฐ ์๋ฃ๋๋ฉฐ, ์ ํ๊ฐ ์๋ฃ๋๊ธฐ ์ ๊น์ง ์ธ์ ํ ๊ตฌ์ญ์ ์ ํ๋์ง ์์ ๊ตฌ์ญ์ผ๋ก ๊ฐ์ฃผํ๋ค. ๋ ๊ตฌ์ญ์ด ์๋ก ๋ณ์ ๊ณต์ ํ ๋ ์ธ์ ํ๋ค๊ณ ํ๋ค.
3. ๊ฑด๋ฌผ์ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ํ๋ ์์ ์ผ๋ก๋ถํฐ $T_{B}$์๊ฐ ๋์์ ๊ฑด๋ฌผ ๋ด๋ถ์ ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๋ค. ์ด ๊ธฐ๊ฐ ๋์ ๊ฑด๋ฌผ ๋ด๋ถ๋ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ํ๋์ง ์์ ์ธต์ผ๋ก ๋ํผํ ์ ์์ด ์์ ํ๋ค. ๋ฐ์ด๋ฌ์ค๊ฐ ์ ํ๋ ์ง $T_{B}$์๊ฐ์ด ์ง๋ ๋ค ๋ชจ๋ ์ธต์ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ํ๋์ด ๊ฑด๋ฌผ์ด ๋์ด์ ์์ ํ์ง ์๊ฒ ๋๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก ์ํ์ข์ฐ๋ก ์ธ์ ํ ๊ตฌ์ญ์ $1$์๊ฐ ๋ค ๋ฐ์ด๋ฌ์ค๊ฐ ์ ํ๋๋ค.
ํ๋์ ๊ตฌ์ญ์ ๊ฒฉ์์ ํ ์นธ์ ์๋ฏธํ๋ฉฐ, ๋ฐ์ด๋ฌ์ค๊ฐ ์ ํ๋์ง ์์ ๊ตฌ์ญ๊ณผ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ํ๋ ์์ ์ผ๋ก๋ถํฐ
$T_{B}$์๊ฐ์ด ์ง๋์ง ์์ ๊ฑด๋ฌผ์ ์์ ํ ๊ตฌ์ญ, ๊ทธ ์ธ ๋ชจ๋ ๊ตฌ์ญ์ ์์ ํ์ง ์์ ๊ตฌ์ญ์ผ๋ก ๋ถ๋ฅํ๋ค.
์ฐ์ง๋๋ ํ
๋ฌ์ ๋ถ์ฐ๋ํ๊ต ํ์ฐ๋ค์ด ํฉ์ธ๋ฆฌ์ง ์๋๋ก ์์ ํ ๊ณณ์ผ๋ก ๋ํผ์ํค๊ณ ์ถ์ด ํ๋ค. ๋ฐ์ด๋ฌ์ค๋ฅผ ํผํด ๋ํผํ ์ ์๋ ๊ตฌ์ญ์ ๊ตฌํด์ฃผ์.
์ ๋ ฅ

์ถ๋ ฅ

ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ ๋ชปํ์ง๋ง ํ์ด๋๊ฐ ๊ณผ์ ์ ๋๋ค.
- ๊ณตํต ์ฌํญ
- ๋น ๊ณณ์ 0
- ๋ฐ์ด๋ฌ์ค๋ -1
- ๊ฑด๋ฌผ์ ๊ฑด๋ฌผ์์ ์ ํ๊ฐ ์ง์ฐ๋๋ ์๊ฐ (T_B)๋ก ๋ฐฐ์ด์ ๊ธฐ๋ก
- -1์ด ๋๋ฉด ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆด ์ ์๋ ์ํ์.
## ์ฒซ๋ฒ์งธ ์๋
- ๋งค ์๊ฐ๋ง๋ค bfs๋ก ๋ฐ์ด๋ฌ์ค ์์น๋ฅผ ์ฐพ๊ณ , ๋ฐ์ด๋ฌ์ค ์์น์์ ์ ํ ์๋
-> ์๊ฐ์ด๊ณผ
O(N*M*T)๋ ์ค๋ ๊ฑธ๋ฆผ
## ๋ ๋ฒ์งธ ์๋
- ํ๋ฒ ํผ์ง ์ง์ญ์์๋ ๋ฐ์ด๋ฌ์ค ์ ํ๋ฅผ ํ ํ์ ์์ (์ด๋ฏธ ์ฌ๋ฐฉ์ ํผ๋จ๋ ธ๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ์ ํ ๋ถ๊ฐ)
- ์์ํ ๋ ๋ฐ์ด๋ฌ์ค์ ์์น๋ฅผ queue๋ก ๋ฐ๊ณ , ์๋ก ์ ํ๋ ์ง์ญ์ ๋ค์ queue์ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์
- ๋ฐ์ด๋ฌ์ค ์์น์๋ค๋ฉด ์ ํ ์๋, ๊ฑด๋ฌผ ์์น์๋ค๋ฉด ์๊ธฐ ์์น์ ๊ฐ์ -1ํ๊ณ ๋ค์ queue์ ๋ฃ์ด์ฃผ๊ธฐ
-> ์๊ฐ ์ด๊ณผ
- ๋ง์ฝ ๋ฐ์ด๋ฌ์ค๊ฐ ๊ฑด๋ฌผ์ ์๊ณ , ๊ฑด๋ฌผ์์ ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๊ธฐ๊น์ง์ ์๊ฐ ๊ฐ์ด ๋๋ค๋ฉด?
-> ๊ณ์ํด์ ๊ฑด๋ฌผ ์๊ฐ -1, queue์ ๋ค์ ๋ฃ๊ธฐ ์์ ์ ๋ฐ๋ณตํด ์ค์ผํจ.
## ์ธ ๋ฒ์งธ ์๋
- ๋ง์ฝ์ ๋ฐ์ด๋ฌ์ค๊ฐ ๊ฑด๋ฌผ์๋ง ์๋ค๋ฉด ํ์ ์ ํ ์๋
- ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๊ธฐ ์์ํ๊ธฐ๊น์ง ๊ฐ์ฅ ์งง์ ์๊ฐ์ด ๋จ์ ๊ฑด๋ฌผ์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก (A)
- A๊ฐ ์ ์ฒด ๋จ์ ์๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด -> ์ข ๋ฃ
- A๊ฐ ์ ์ฒด ๋จ์ ์๊ฐ ๋ณด๋จ ์ ๋ค๋ฉด
- ๊ฑด๋ฌผ๋ค์ ๋ํด A๋งํผ์ฉ ๋นผ์ฃผ๊ณ , ์ ์ฒด ๋จ์ ์๊ฐ๋ A๋งํผ ๋นผ์ค
-> ์๊ฐ ์ด๊ณผ
- ์ฌ์ ํ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
์ด๋ป๊ฒ ํ์ด์ผ ํ์๊น??
- ๋ค์ต์คํธ๋ผ ์ ์ฉ ๋ก์ง
- ์ฐ์ ์์ ํ ์ฌ์ฉ : [์๊ฐ, y, x] ํํ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ , ์๊ฐ์ด ์งง์ ์์ผ๋ก ์ ๋ ฌ
- time[n][m] ๋ฐฐ์ด : ๊ฐ ์นธ์ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ํ๋๋ ์ต์ ์๊ฐ์ ์ ์ฅํ๋ฉฐ, ์ด๊ธฐ ๊ฐ์ ์ถฉ๋ถํ ํฐ ๊ฐ์ผ๋ก ์ค์
- ์ด๊ธฐ ์ํ : ์ฒ์๋ถํฐ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์์น๋ค์ ํ์ ๋ฃ๊ณ time[y][x]= 0์ผ๋ก ์ค์
- ํ์
- ํ์์ ๊ฐ์ฅ ์๊ฐ์ด ์ ๊ฒ ๊ฑธ๋ฆฌ๋ ์นธ ๊บผ๋ด๊ธฐ
- ์ํ์ข์ฐ๋ฅผ ์ดํผ๋ฉฐ ๋ค์์นธ์ผ๋ก ์ด๋ํ ๋..
- ๋น์นธ์ด๋ฉด nextTime = currentTime + 1
- ๊ฑด๋ฌผ์ด๋ฉด nextTime = currentTime + 1 + b
- nextTime์ด time[ny][nx] ๋ณด๋ค ์๊ณ , ์ ์ฒด ์๊ฐ์ดํ๋ผ๋ฉด ๊ฐ์ ๊ฐฑ์ ํ๊ณ ํ์ ๋ฃ๊ธฐ
- ๋ถํ์ํ ๋ฐ๋ณต ์ ๊ฑฐ - ๋ฐ์ด๋ฌ์ค๊ฐ ์ ํ๋ ๊ฐ๋ฅ์ฑ ์๋ ๊ฒฝ๋ก๋ง ์ฐ์ ์์ ํ๋ฅผ ํตํด ํ์
- ์๊ฐ ๋ณต์ก๋ : O(ElogV)์์ค์ผ๋ก ์ค์ด๋ฌ.
- ์ ํ์ฑ : ๊ฑด๋ฌผ์ ๋ง๋ฌ์ ๋, ์ ํ ์์์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ฏธ๋ฆฌ ๊ณ์ฐํ์ฌ ํ์ ๋ฃ์ผ๋ฏ๋ก ๋งค ์๊ฐ ์ ๋ฐ์ดํธ ํ์ ์
import java.util.*;
import java.io.*;
public class Main {
static int[] dy = {-1, 1, 0, 0};
static int[] dx = {0, 0, -1, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int G = Integer.parseInt(st.nextToken()); // ์ด ์๊ฐ
int B = Integer.parseInt(st.nextToken()); // ๋ด๊ตฌ๋
int X = Integer.parseInt(st.nextToken()); // (๋ฌธ์ ์ ์ถ๊ฐ ๋ณ์ X)
int numBuilding = Integer.parseInt(st.nextToken());
int[][] boardType = new int[n][m]; // 0: ๋น์นธ, 1: ๊ฑด๋ฌผ, 2: ์ด๊ธฐ ๋ฐ์ด๋ฌ์ค
int[][] minTime = new int[n][m];
PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[0]));
for (int i = 0; i < n; i++) {
String line = br.readLine();
Arrays.fill(minTime[i], Integer.MAX_VALUE);
for (int j = 0; j < m; j++) {
char c = line.charAt(j);
if (c == '*') { // ์ด๊ธฐ ๋ฐ์ด๋ฌ์ค
boardType[i][j] = 2;
minTime[i][j] = 0;
pq.add(new int[]{0, i, j});
} else if (c == '#') {
boardType[i][j] = 1;
} else {
boardType[i][j] = 0;
}
}
}
// ๋ค์ต์คํธ๋ผ ์ํ
while (!pq.isEmpty()) {
int[] curr = pq.poll();
int t = curr[0];
int y = curr[1];
int x = curr[2];
if (t > minTime[y][x]) continue;
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
if (ny >= 0 && ny < n && nx >= 0 && nx < m) {
// ๋ค์ ์นธ์ด ๋ฐ์ด๋ฌ์ค๊ฐ ๋๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ๋น์ฉ ๊ณ์ฐ
int cost = (boardType[ny][nx] == 1) ? B + 1 : 1;
int nextT = t + cost;
if (nextT <= G && nextT < minTime[ny][nx]) {
minTime[ny][nx] = nextT;
pq.add(new int[]{nextT, ny, nx});
}
}
}
}
// ๊ฒฐ๊ณผ ์ถ๋ ฅ (G์๊ฐ ์ดํ์๋ ๋ฐ์ด๋ฌ์ค๊ฐ ๋์ง ์์ ์นธ)
StringBuilder sb = new StringBuilder();
int count = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
// ์ด๊ธฐ ๋ฐ์ด๋ฌ์ค๋ ์๋๊ณ , ๊ฑธ๋ฆฐ ์๊ฐ์ด G๋ฅผ ์ด๊ณผํ๋ฉด ์์กด
if (boardType[i][j] != 2 && minTime[i][j] > G) {
sb.append((i + 1)).append(" ").append((j + 1)).append("\n");
count++;
}
}
}
if (count == 0) System.out.println(-1);
else System.out.print(sb);
}
}'๐์ฝ๋ฉํ ์คํธ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [๋ฐฑ์ค] 27978 - ๋ณด๋ฌผ ์ฐพ๊ธฐ 2 (Java) (0) | 2026.02.04 |
|---|---|
| [๋ฐฑ์ค] 3079 - ์ ๊ตญ์ฌ์ฌ (Java) (0) | 2026.02.04 |
| [๋ฐฑ์ค] 9996 - ํ๊ตญ์ด ๊ทธ๋ฆฌ์ธ ๋ ์๋ฒ์ ์ ์ํ์ง (Java) (1) | 2026.02.02 |
| [๋ฐฑ์ค] 11655 - ROT13 (Java) (0) | 2026.02.02 |
| [๋ฐฑ์ค] 1159 - ๋๊ตฌ ๊ฒฝ๊ธฐ (Java) (0) | 2026.02.02 |
์ฌ์ฐ๋น์ ๊ฐ๋ฐ ๋ธ๋ก๊ทธ
https://www.youtube.com/watch?v=SVGTzOL357Y&list=RDSVGTzOL357Y&start_radio=1