Tags
- ๊น์ด ์ฐ์ ํ์
- ์ ๋ ฌ
- ๊ต์ฌ
- Java
- queue
- ๋๋น ์ฐ์ ํ์
- ๋ฌธ์์ด
- ๋ฐฑํธ๋ํน
- LV2
- SpringBoot
- CodingTest
- stack
- PGM
- DP
- greedy
- Dynamic Programming
- ๊ทธ๋ํ ์ด๋ก
- BOJ
- Python
- Brute Force Algorithm
- sort
- Study
- ๊ทธ๋ํ ํ์
- ์๋ฃ๊ตฌ์กฐ
- ์๋ฎฌ๋ ์ด์
- ์ ์๋ก
- BFS
- dfs
- ๊ตฌํ
- ์ํ
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_1261 : ์๊ณ ์คํ ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- N*M ๋ฏธ๋ก์์ (1, 1) ๋ถํฐ (N, M) ๊น์ง ๊ฐ๋ ์ต์ ๋น์ฉ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
- ๋ฏธ๋ก๋ ๋น ๋ฐฉ๊ณผ ๋ฒฝ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ๋ฒฝ์ ๋ถ์๋๋ฐ ๋น์ฉ์ด 1 ์๋ชจ๋๋ค.
๐ธ ๋ฌธ์ ํ์ด ๐ธ
- ๊ฐ์ค์น๊ฐ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ๊ทธ๋ํ์์ ์ต์ ๋น์ฉ ํน์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ผ๊ณ ๋ณผ ์ ์๋ค.
- ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ๋ ๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ์ ๋ง์ด ์ฌ์ฉํ๋ค. ์ฒซ ๋ฒ์งธ ํ์ด์์ ์ฌ์ฉํ๋ค.
- ๋ค์ต์คํธ๋ผ์ ์๊ฐ ๋ณต์ก๋๋ O(E log V) ์ด๋ค.
- ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํด ๊ฐ๋ฉฐ, ๊ฐ์ค์น๊ฐ ๋ ์ ์ ๊ฒฝ๋ก๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ํด๋น ๋ ธ๋๋ถํฐ ๋ค์ ๊ฒฝ๋ก๋ฅผ ํ์ํด๋ณด๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๊ฐ์ค์น๊ฐ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ๊ฒฝ์ฐ์ 0-1 BFS๋ฅผ ์ฌ์ฉํด์ ๋ ํจ์จ์ ์ผ๋ก ํ์ดํ ์ ์๋ค.
- 0-1 BFS์ ์๊ฐ ๋ณต์ก๋๋ O(V + E) ์ด๋ค.
- ๋ชจ๋ ๋ ธ๋์ ๊ฒฝ๋ก๋ฅผ 1๋ฒ์ฉ๋ง ๋ฐฉ๋ฌธํ๋ค.
- ํ ๋์ ๋ฑ์ ์ฌ์ฉํ๋ฉฐ ๊ฐ์ค์น๊ฐ 0์ธ ๊ฒฝ์ฐ๋ front, ๊ฐ์ค์น๊ฐ 1์ธ ๊ฒฝ์ฐ๋ back์ ์ฝ์ ํ๋ค.
- ๋ฑ์ front ๋ถํฐ ๋ ธ๋๋ฅผ ๊บผ๋ด ํ์ํ๋ฉฐ, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋จผ์ ํ์ํ๋ ํจ๊ณผ๊ฐ ์๊ธด๋ค.
๐ธ ๊ธฐ์กด ์ฝ๋ ๐ธ
import java.io.*;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
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());
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
boolean[][] map = new boolean[N][M]; // ๋งต ์ ๋ณด
int[][] visited = new int[N][M]; // ๋ฐฉ๋ฌธ์ ๋ถ์ ๋ฒฝ์ ๊ฐฏ์ ์ต์๊ฐ
for (int i = 0; i < N; i++) {
char[] chars = br.readLine().toCharArray();
for (int j = 0; j < M; j++) {
map[i][j] = chars[j] == '0'; // ๋ฒฝ์ false
visited[i][j] = Integer.MAX_VALUE; // ๋ถ์ ๋ฒฝ ๊ฐฏ์ ์ด๊ธฐํ
}
}
// BFS
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
Queue<AOJ> que = new ArrayDeque<>();
que.add(new AOJ(0, 0, 0));
visited[0][0] = 0;
int answer = Integer.MAX_VALUE;
while (!que.isEmpty()) {
AOJ aoj = que.poll();
if (aoj.row == N - 1 && aoj.col == M - 1) {
answer = Math.min(answer, aoj.broken);
} else {
for (int i = 0; i < 4; i++) {
int r = aoj.row + dx[i];
int c = aoj.col + dy[i];
if (0 <= r && r < N && 0 <= c && c < M) {
if (map[r][c] && visited[r][c] > aoj.broken) {
visited[r][c] = aoj.broken;
que.add(new AOJ(r, c, aoj.broken));
} else if (visited[r][c] > aoj.broken + 1) {
visited[r][c] = aoj.broken + 1;
que.add(new AOJ(r, c, visited[r][c]));
}
}
}
}
}
// Output
bw.write(Integer.toString(visited[N - 1][M - 1]));
bw.flush();
}
public static class AOJ {
int row, col, broken;
public AOJ(int row, int col, int broken) {
this.row = row;
this.col = col;
this.broken = broken;
}
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- BFS ํ์์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ ์ฅ๋ ๋น์ฉ์ ๊ฐฑ์ ์ด ์ผ์ด๋๋ฉด ๋ค์ ํ์์ ์์ํ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ฉ๋์๋ค.
- ๋ฐฉ๊ณผ ๋ฒฝ ์ ๋ณด๋ boolean ์ด์ค๋ฐฐ์ด map์ผ๋ก, ์ต์ ๋น์ฉ์ ์ ์ฅ์ intํ ์ด์ค๋ฐฐ์ด visited๋ฅผ ์ฌ์ฉํ๋ค.
- ํ๊ฐ ๋ชจ๋ ๋น ๋ ๊น์ง ๋ฐ๋ณตํ๋ฏ๋ก, answer์ ์ฌ์ฉํ ํ์๊ฐ ์์๋ค.
๐ธ 0-1 BFS ์ฝ๋ ๐ธ
import java.io.*;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;
public class Main {
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());
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
int[][] map = new int[N][M]; // ๋งต ์ ๋ณด
for (int i = 0; i < N; i++) {
char[] chars = br.readLine().toCharArray();
for (int j = 0; j < M; j++) {
map[i][j] = Character.getNumericValue(chars[j]);
}
}
// 0-1 BFS
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
Deque<AOJ> dq = new ArrayDeque<>();
dq.addFirst(new AOJ(0, 0, 0));
while (!dq.isEmpty()) {
AOJ aoj = dq.pollFirst();
if (aoj.row == N - 1 && aoj.col == M - 1) { // Output
bw.write(Integer.toString(aoj.broken));
bw.flush();
break;
} else {
for (int i = 0; i < 4; i++) {
int r = aoj.row + dx[i];
int c = aoj.col + dy[i];
if (0 <= r && r < N && 0 <= c && c < M) {
if (map[r][c] == 0) {
dq.addFirst(new AOJ(r, c, aoj.broken));
} else if (map[r][c] == 1) {
dq.addLast(new AOJ(r, c, aoj.broken + 1));
}
map[r][c] = -1; // ๋ฐฉ๋ฌธ์ฒดํฌ
}
}
}
}
}
public static class AOJ {
int row, col, broken;
public AOJ(int row, int col, int broken) {
this.row = row;
this.col = col;
this.broken = broken;
}
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- ๊ธฐ์กด ๋ค์ต์คํธ๋ผ ํ์ด ์ฝ๋๋ฅผ ๊ฐ์ ํด์ 0-1 BFS ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ ํ์ด์ด๋ค.
- ๊ฐ์ค์น๊ฐ 0์ด๋ฉด front, 1์ด๋ฉด back์ ์ฝ์ ํ๋ค.
- ๋ฐฉ๋ฌธํ ๋ ธ๋๋ 4๋ฐฉ ํ์์์ ์ ์ธํ๊ธฐ ์ํด ๋งต ์ ๋ณด๋ฅผ -1๋ก ๋ฐ๊ฟ๋ฒ๋ ธ๋ค.
๐ธ end ๐ธ
- ์ฒ์ ๋ฌธ์ ๋ฅผ ํ ๋๋ N x M ํํ์ ๋งต์ด์ฌ์ ๋จ์ BFS ์ต์ ํ ์ธ ์ค ์์๋ค.
- ๋ค์๋ณด๋ 2์ฐจ์ ๋ฐฐ์ด์์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ ํ ๊ฒ์ด์๋ค.
- ์ฌ์ฉํ ์๊ณ ๋ฆฌ์ฆ๋ ์ ๋๋ก ์ธ์ง๋ฅผ ๋ชปํ๋ค๋... ๋ฐ์ฑํ๊ฒ ๋๋ค.
- ๋ฌธ์ ๋ฅผ ๋ง์ถ ์ดํ์ ํ๊ทธ๋ฅผ ํ์ธํด๋ณด๋ 0-1 BFS๊ฐ ์๊ธธ๋ ์ฐพ์๋ณด๊ฒ ๋์๋ค.
- ์ธ์ ๋ณธ์ ์ด ์๋ ์๊ณ ๋ฆฌ์ฆ์ธ๋ฐ ์ด๋ ต์ง ์์ผ๋ฉด์ ์ ์ฉํด์ ๋ฐ๋ก ํฌ์คํ ์ ๋ฆฌํ๊ณ , ์ ์ฉํด์ ์ฌํ์ด ํ๋ค.
- 0,1 ๊ฐ์ค์น ๊ทธ๋ํ์์ ๋ค์ต์คํธ๋ผ ๋ณด๋ค ์ข์ ์๊ฐ ๋ณต์ก๋๊ฐ ๋์จ๋ค๊ณ ์๊ฒ ๋์๋๋ฐ, ํ์คํ ์๊ฐ์ด ์ค์ด๋ ๋ชจ์ต์ด๋ค.
728x90
'CodingTest > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ_1915 : ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ (0) | 2024.05.11 |
---|---|
BOJ_11657 : ํ์๋จธ์ (0) | 2024.05.11 |
BOJ_1339 : ๋จ์ด ์ํ (0) | 2024.05.06 |
BOJ_14002 : ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 4 (0) | 2024.05.01 |
BOJ_1922 : ๋คํธ์ํฌ ์ฐ๊ฒฐ (0) | 2024.04.30 |