Tags
- ์ ๋ ฌ
- Python
- dfs
- greedy
- ๊ตฌํ
- LV2
- ๋ฐฑํธ๋ํน
- queue
- ๊ทธ๋ํ ํ์
- ์ ์๋ก
- ๋ฌธ์์ด
- PGM
- ์๋ฃ๊ตฌ์กฐ
- BFS
- sort
- CodingTest
- ์๋ฎฌ๋ ์ด์
- ๋๋น ์ฐ์ ํ์
- Study
- DP
- Brute Force Algorithm
- SpringBoot
- ๊ต์ฌ
- BOJ
- ๊ทธ๋ํ ์ด๋ก
- Java
- ์ํ
- stack
- Dynamic Programming
- ๊น์ด ์ฐ์ ํ์
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_2146 : ๋ค๋ฆฌ ๋ง๋ค๊ธฐ ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- N x N ์ง๋์ 2๊ฐ ์ด์์ ์ฌ์ด ์ฃผ์ด์ง๋ค. ์ฌ์ 1๋ก ์ํ์ข์ฐ ์ฐ๊ฒฐ๋ ๋ฉ์ด๋ฆฌ์ด๋ค.
- ์๋ก ๋ค๋ฅธ ๋ ์ฌ ์ฌ์ด์ ๋ค๋ฆฌ ํ๋๋ฅผ ๋์ ๋, ๋ค๋ฆฌ์ ๊ธธ์ด์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ธ ๋ฌธ์ ํ์ด ๐ธ
- ๋จ์ํ ๊ทธ๋ํ ํ์ ๋ฌธ์ ์ด๋ค.
- ๋จผ์ ์ง๋ ์์ ๊ฐ์ ์ฌ ์์ 1๋ค์ ๋ฌถ์ด์ค ํ์๊ฐ ์๋ค.
- ๋ค๋ฆฌ๋ฅผ ์ง์ ๋, ์๋ก ๋ค๋ฅธ ์ฌ์ธ์ง ์์์ผ ํ๋ฏ๋ก ์ฌ ๋ฉ์ด๋ฆฌ ๋ณ ๋ค๋ฅธ ๊ฐ์ ๋ฃ๋๋ค.
- ๋จ์ํ 4๋ฐฉ ํ์์ด๋ฏ๋ก, DFS๋ BFS ์๊ด ์์ด ์ฌ์ฉํ๋ฉด ๋๋๋ฐ, ์ฌ๊ธฐ์๋ DFS๋ก ํต์ผํด์ ์ฌ์ฉํ๋ค.
- ์ฌ ์ฌ์ด์ ๋ค๋ฆฌ๊ฐ ๋์ด๋์ง ํ์ธํด์ผ ํ๋ค.
- DFS๋ก ํ์ชฝ ์ฌ์ ๋์์ ๋ค๋ฅธ ์ฌ์ ๋ฐ๊ฒฌ ํ ๋๊น์ง ํ์ํ๋ค.
- ํ๋ฒ ๋ค๋ฆฌ๊ฐ ์์ฑ๋๋ฉด, ์ต์๊ฐ์ผ๋ก ์ ์ฅํ๊ณ ๋ฐฑํธ๋ํน์ ์ด์ฉํ๋ค.
๐ธ ์ฝ๋ ๐ธ
import java.io.*;
import java.util.StringTokenizer;
public class Main {
private static final int[] dx = {-1, 0, 1, 0};
private static final int[] dy = {0, 1, 0, -1};
private static int min;
private static int[][] map;
private static int[][] 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;
int N = Integer.parseInt(br.readLine());
map = new int[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
// ์ฌ ๋ฌถ๊ธฐ
int cnt = 0; // ์ฌ์ ๊ฐฏ์
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j] == 1) {
dfs_island(i, j, ++cnt + 1);
}
}
}
// ๋ค๋ฆฌ ์ง๊ธฐ
min = Integer.MAX_VALUE;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j] > 1) {
visited = new int[N][N];
for (int k = 0; k < N; k++) {
for (int l = 0; l < N; l++) {
visited[k][l] = Integer.MAX_VALUE;
}
}
dfs_bridge(i, j, map[i][j], 0);
}
}
}
// Output
bw.write(Integer.toString(min));
bw.flush();
}
private static void dfs_bridge(int row, int col, int num, int depth) {
visited[row][col] = depth;
if (depth >= min)
return;
for (int i = 0; i < 4; i++) {
int r = row + dx[i];
int c = col + dy[i];
if (0 <= r && r < map.length && 0 <= c && c < map.length && visited[r][c] > depth + 1 && map[r][c] != num) {
if (map[r][c] == 0) {
dfs_bridge(r, c, num, depth + 1);
} else {
min = Math.min(min, depth);
return;
}
}
}
}
private static void dfs_island(int row, int col, int iNum) {
map[row][col] = iNum;
for (int k = 0; k < dx.length; k++) {
int r = row + dx[k];
int c = col + dy[k];
if (0 <= r && r < map.length && 0 <= c && c < map.length && map[r][c] == 1) {
dfs_island(r, c, iNum);
}
}
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- dfs_island() ๋ฉ์๋๋ฅผ ์ด์ฉํด dfs๋ก ์ธ์ ํ 1๋ค์ ๋ฌถ์ด ์ฌ ๋ฉ์ด๋ฆฌ๋ฅผ ํ์ํ๋ค.
- dfs_bridge() ๋ฉ์๋์์ dfs ๋ฐฉ์์ผ๋ก ๋ค๋ฆฌ๋ฅผ ๊ทธ๋ ค๊ฐ๋ฉฐ ์ต์๊ฐ์ ์ฐพ์๋ค.
- ์ต์๊ฐ์ min์ ์ ์ฅํ๊ณ ํด๋น ๊ธธ์ด๋ ๋ ๋ณด์ง ์์๋ ๋๋ฏ๋ก, ์ฆ์ returnํ๋ค.
- ์ต์๊ฐ์ ์ฐพ์ ํ์๋ ํด๋น ๊ฐ์ผ๋ก ๋ฐฑํธ๋ํน์ ์ํํ๋ค.
๐ธ end ๐ธ
- ๊ฒฝ๊ณ๊ฐ(minimum)์์ 2ํ ํ๋ ธ๋ค.
- N์ด 100์ดํ์ ์์ฐ์์ง๋ง, ํญ์ ์ฌ์ด 2๊ฐ์ด์ ์กด์ฌํ๋ค๊ณ ํ์ผ๋ฏ๋ก N์ ์ต์๊ฐ์ 2์ด๋ค.
- dfs_island() ๋ฉ์๋์์ map[row][col] = iNum ์ผ๋ก ๊ฐ์ ๋ฃ๋ ๋ถ๋ถ์ 4๋ฐฉํ์ if๋ฌธ ์์ ๋ฃ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค๊ฐ N์ด 2์ผ๋ ํ๋ฆฌ๊ฒ ๋์๋ค.
- ์์ ์์น๋ง ๊ฐ์ด ์์ด์ง ์์๋ ๊ฒ์ด๋ค.
- ์๊ณ ๋ฆฌ์ฆ ์์ฒด๋ ๋จ์ํ ๊ทธ๋ํ ํ์์ด์๋๋ฐ, ๋ฌธ์ ํ๊ทธ์๋ BFS๋ง ์ ํ์์ด์ ๋๋๋ค. ํ์คํ ๋ค๋ฆฌ๋ฅผ ์ง๋๊ฑด ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ BFS๋ฅผ ์ฌ์ฉํ์ด์ผ ํ์ง๋ง, ๋ฌธ์ ์กฐ๊ฑด์ด ๊น๋ค๋กญ์ง ์์์ DFS + ๋ฐฑํธ๋ํน์ผ๋ก ํ์ด๊ฐ ๋ ๊ฒ ๊ฐ๋ค.
- ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ ๋ฆฌํ๋ค.
728x90
'CodingTest > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ_4179 : ๋ถ! (0) | 2024.06.11 |
---|---|
BOJ_1937 : ์์ฌ์์ด ํ๋ค (0) | 2024.06.10 |
BOJ_15685 : ๋๋๊ณค ์ปค๋ธ (0) | 2024.05.26 |
BOJ_11066 : ํ์ผ ํฉ์น๊ธฐ (0) | 2024.05.24 |
BOJ_11049 : ํ๋ ฌ ๊ณฑ์ ์์ (0) | 2024.05.23 |