Tags
- queue
- Study
- ๊ตฌํ
- BOJ
- ๊ต์ฌ
- Python
- Java
- ๊ทธ๋ํ ์ด๋ก
- Brute Force Algorithm
- CodingTest
- SpringBoot
- ๋๋น ์ฐ์ ํ์
- ์ ๋ ฌ
- ๋ฐฑํธ๋ํน
- LV2
- greedy
- DP
- ๊น์ด ์ฐ์ ํ์
- BFS
- ์ ์๋ก
- ์๋ฎฌ๋ ์ด์
- Dynamic Programming
- ๋ฌธ์์ด
- ์๋ฃ๊ตฌ์กฐ
- stack
- dfs
- PGM
- ์ํ
- sort
- ๊ทธ๋ํ ํ์
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_1113 : ์์์ฅ ๋ง๋ค๊ธฐ ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- N x M ์ง์ฌ๊ฐํ ๋ ์ ์์์ฅ์ ๋ง๋ ๋ค. ๊ฒฉ์ ์ ์ซ์๊ฐ ํด๋น ๋ ์ ๋์ด์ด๋ค.
- ๋ฌผ์ ์ฑ์์ผ ํ๋๋ฐ, ๋ฌผ์ ์ํ์ข์ฐ ๋์ ๊ณณ์์ ๋ฎ์ ๊ณณ์ผ๋ก๋ง ํ๋ฅด๊ณ ๊ฒฉ์ ๋ฐ์ผ๋ก๋ ๋ฌดํ์ ํ๋ฌ๋๊ฐ ๋ฒ๋ฆฐ๋ค.
- ์ฑ์ธ ์ ์๋ ๋ฌผ์ ์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ธ ๋ฌธ์ ํ์ด ๐ธ
- ์ํ์ข์ฐ ์ธ์ ๋ ์ผ๋ก ํ๋ฅด๋ ๋ฌผ์ ์ด๋์ ๊ตฌํํ๊ธฐ ์ํด์ BFS๋ฅผ ์ฌ์ฉํ๋ค.
- ์ธ๊ฐ์ ๋ถ์ ๋ ์ ๋ฌผ์ด ๊ณ ์ผ ์ ์์ผ๋ฏ๋ก, ์ญ๋ฐฉํฅ BFS๋ฅผ ํตํด ์ด์ด์ง ๋ ๋ค์ ๋ชจ๋ ์ฒดํฌํ๋ค.
- ๋ฌผ์ด ๊ณ ์ผ ์ ์๋ ๋ ๋ค์ ๋ฌผ์ ์ฑ์ฐ๊ณ ์ดํฉ์ ์ถ๋ ฅํ๋ค.
- ๋ฌผ ๋์ด์ ์ต๋๊ฐ์ 2๊ฐ์ง ๊ธฐ์ค์ ์ ์ํด์ ์ ํ๋ค.
- ํด๋น ๋์ด๋ณด๋ค ๋์์ง๋ฉด ๋ฌผ์ด ํ๋ฌ๋๊ฐ๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ : ์ต๋๊ฐ์ ์ธ๋ฑ์ค๊ฐ ์ฒดํฌ๋ ๊ฒฝ์ฐ
- ํ๋ฌ๋๊ฐ์ง๋ ์์ง๋ง, ๋ ์ด ๋์์ ์กฐ๊ธ ๋ ๋์ด ๋ฌผ์ด ๊ณ ์ด๋ ๊ฒฝ์ฐ : ์ต๋๊ฐ์ ์ธ๋ฑ์ค๊ฐ ์ฒดํฌ๋์ง ์์ ๊ฒฝ์ฐ
๐ธ ์ฝ๋ ๐ธ
import java.io.*;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
private static final int[][] dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // ์ํ์ข์ฐ
private static int N, M;
private static int[][] pool;
private static boolean[][] visited;
public static void main(String[] args) throws IOException {
// Input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
pool = new int[N][M];
visited = new boolean[N][M];
for (int i = 0; i < N; i++) {
char[] chars = br.readLine().toCharArray();
for (int j = 0; j < M; j++) {
pool[i][j] = Character.getNumericValue(chars[j]);
}
}
// BFS 1) ๋ฌผ์ ๋ถ์ผ๋ฉด ์๋๋ ๊ณณ์ true
for (int i = 0; i < N; i++) {
if (!visited[i][0]) {
noWater_Upper(new Point(i, 0));
}
if (!visited[i][M - 1]) {
noWater_Upper(new Point(i, M - 1));
}
}
for (int i = 0; i < M; i++) {
if (!visited[0][i]) {
noWater_Upper(new Point(0, i));
}
if (!visited[N - 1][i]) {
noWater_Upper(new Point(N - 1, i));
}
}
// BFS 2) ์ฑ์ฐ๋ ๋ฌผ ์ ์นด์ดํธ
int cnt = 0;
for (int i = 1; i < N - 1; i++) {
for (int j = 1; j < M - 1; j++) {
if (!visited[i][j]) {
cnt += cntPoolWater(new Point(i, j));
}
}
}
// Output
bw.write(Integer.toString(cnt));
bw.flush();
}
private static void noWater_Upper(Point start) { // ์์น ๋ฐฉํฅ์ผ๋ก ๋ฌผ์ ๋ชป ๋ด๋ ์์น ํ์
Queue<Point> que = new ArrayDeque<>();
que.add(start);
visited[start.row][start.col] = true;
while (!que.isEmpty()) {
Point p = que.poll();
for (int[] dir : dir) {
int row = p.row + dir[0];
int col = p.col + dir[1];
if (0 <= row && row < N && 0 <= col && col < M
&& !visited[row][col] && pool[row][col] >= pool[p.row][p.col]) {
visited[row][col] = true;
que.add(new Point(row, col));
}
}
}
}
private static int cntPoolWater(Point start) { // ๋ฌผ์ด ๊ณ ์ด๋ ์ต๋ ๋์ด ๋ฐํ
int maxHeight = Integer.MAX_VALUE;
Queue<Point> que = new ArrayDeque<>();
Queue<Point> water = new ArrayDeque<>();
boolean[][] flag = new boolean[N][M];
que.add(start);
water.add(start);
flag[start.row][start.col] = true;
while (!que.isEmpty()) { // ๋ฌผ ๋์ด์ ์ต๋๊ฐ ์ฐพ๊ธฐ
Point p = que.poll();
for (int[] dir : dir) {
int row = p.row + dir[0];
int col = p.col + dir[1];
if (visited[row][col]) { // ๋ฌผ์ ์ฑ์ฐ๋ฉด ์๋๋ ๊ณณ
if (pool[row][col] <= pool[p.row][p.col]) { // ์ฑ์ฐ๋ฉด ์๋๋ ๊ณณ์ธ๋ฐ ํ๋ฌ๊ฐ
noWater_Upper(new Point(row, col));
return 0;
}
maxHeight = Math.min(maxHeight, pool[row][col]);
} else if (!flag[row][col] && pool[row][col] <= pool[p.row][p.col]) { // ์์ ์์น์ ๋ฌผ ๋ถ์ฐ๋ฉด ๊ฐ์ด ์ฐธ
flag[row][col] = true;
que.add(new Point(row, col));
water.add(new Point(row, col));
} else if (pool[row][col] > pool[p.row][p.col])
maxHeight = Math.min(maxHeight, pool[row][col]);
}
}
int cnt = 0;
for (Point p : water) {
if (maxHeight > pool[p.row][p.col]) {
cnt += maxHeight - pool[p.row][p.col];
pool[p.row][p.col] = maxHeight;
}
}
return cnt;
}
private static class Point {
int row, col;
public Point(int row, int col) {
this.row = row;
this.col = col;
}
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- N x M ๋ ์ ํ ๋๋ฆฌ๋ ๋ฌผ์ด ํ๋ฌ๋๊ฐ๋ฒ๋ฆฐ๋ค. ๋ฌผ์ด ํ๋ฌ ๋ค์ด์ค๋ ๋ ๋ค๋ ๋ชจ๋ ๋ฌผ์ ์ฑ์ฐ๋ฉด ์๋๋ ๋ ์ด๋ฏ๋ก ์ญ๋ฐฉํฅ BFS๋ฅผ ๊ตฌํํ noWater_Upper() ๋ฉ์๋๋ฅผ ํตํด visited๋ฅผ true๋ก ์ฒดํฌํ๋ค.
- visited๊ฐ false์ธ ๋๋จธ์ง ๋
๋ค์ cntPoolWater() ๋ฉ์๋๋ก ๋ฌผ์ ์ฑ์ด๋ค.
- ์์ ์์น์์ ๊ฐ๊ฑฐ๋ ์์ ๋์ด๋ก ์ด์ด์ง ๋ ๋ค์ water ํ์ ๋ฃ๋๋ค.
- ์ด๋ ์ฃผ๋ณ ๋ ์ ๋์ด ์ค ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ max์ ์ ์ฅํ๋ค.
- ํ์์ด ๋๋๋ฉด, water์ ์ ์ฅ ๋ ๋ ๋ค์ max ๋งํผ ๋ฌผ์ ์ฑ์ด๋ค.
๐ธ end ๐ธ
- ์๋นํ ์ด๋ ค์ ๊ณ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฐ ๋ฌธ์ ์ด๋ค. BFS๋ฅผ 2์ข ๋ฅ๋ก ๋๋ ์ ํ๊ณ ์ญ๋ฐฉํฅ์ผ๋ก ํ๋ฉด ๋๊ฒ ๋ค๋ ์์ด๋์ด๋ ๊ธ๋ฐฉ ๋์๋๋ฐ, ๊ตฌ์์ ์กฐ๊ธ ์ด์ํ๊ฒ ํด์ ํ ์ผ๋ฅผ ๋ง์ด ๋ง๋ค์์ด์ผ ํ๋ค.
- ๋ฌผ์ ์ฑ์ฐ๋ cntPoolWater() ๋ฉ์๋์ BFS์์ ํ์ ๋ฒ์๋ฅผ visited๊ฐ false ๊ฒฝ์ฐ๋ก๋ง ๋์๋๋ฐ, ๋ ์ ๋์ด๊ฐ ๊ฐ๊ฑฐ๋ ๋ฎ์ ๊ฒฝ์ฐ๋ผ๋ ์กฐ๊ฑด๋ ์ถ๊ฐ๋ก ํ์ํ๋ค.
- ํ ๋ฒ ํ์ํ ๋ ์ ๋ฐฐ์ ํ๋ ค๊ณ ํ๋๊ฒ ํฐ ์ค์ ์ด์๋๋ฐ, ๊ฐ์ ์นธ์ด์ด๋ ๋ฌผ์ ์ฌ๋ฌ๋ฒ ๋์ฌ๊ฐ๋ ๋ฐฉ์์ผ๋ก ๋ฐ๊พธ์ด์ ํด๊ฒฐ๋์๋ค.
- ์ฝ๋ ๋๋ฒ๊น ์ ์๊ฐ์ด ๋๋ฌด ๊ฑธ๋ ค์ ๋ฆฌํฉํฐ๋ง์ ํฌ๊ธฐํ๊ณ ์ข ์ง์ ๋ถํ ํํ์ ๋ต์์ผ๋ก ๋ง๋ฌด๋ฆฌ๋์๋ค...
728x90
'CodingTest > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ_1948 : ์๊ณ๊ฒฝ๋ก (0) | 2024.09.12 |
---|---|
BOJ_1516 : ๊ฒ์ ๊ฐ๋ฐ (0) | 2024.09.12 |
BOJ_15989 : 1, 2, 3 ๋ํ๊ธฐ 4 (0) | 2024.08.16 |
Lv.3 : ๊ณ ๊ณ ํ ์ต๊ณ ์ ๋ฐ๊ฒฌ (0) | 2024.08.15 |
Lv.3 : ๊ณต ์ด๋ ์๋ฎฌ๋ ์ด์ (0) | 2024.08.02 |