λ¬Έμ λ§ν¬
https://www.acmicpc.net/problem/7576
7576λ²: ν λ§ν
첫 μ€μλ μμμ ν¬κΈ°λ₯Ό λνλ΄λ λ μ μ M,Nμ΄ μ£Όμ΄μ§λ€. Mμ μμμ κ°λ‘ μΉΈμ μ, Nμ μμμ μΈλ‘ μΉΈμ μλ₯Ό λνλΈλ€. λ¨, 2 ≤ M,N ≤ 1,000 μ΄λ€. λμ§Έ μ€λΆν°λ νλμ μμμ μ μ₯λ ν λ§ν
www.acmicpc.net
λμ΄λ
μκ°μ ν
1μ΄
λ¬Έμ
μ² μμ ν λ§ν λμ₯μμλ ν λ§ν λ₯Ό 보κ΄νλ ν° μ°½κ³ λ₯Ό κ°μ§κ³ μλ€.
ν λ§ν λ μλμ κ·Έλ¦Όκ³Ό κ°μ΄ 격μ λͺ¨μ μμμ μΉΈμ νλμ© λ£μ΄μ μ°½κ³ μ 보κ΄νλ€.
μ°½κ³ μ 보κ΄λλ ν λ§ν λ€ μ€μλ μ μ΅μ κ²λ μμ§λ§, μμ§ μ΅μ§ μμ ν λ§ν λ€λ μμ μ μλ€.
λ³΄κ΄ ν νλ£¨κ° μ§λλ©΄, μ΅μ ν λ§ν λ€μ μΈμ ν κ³³μ μλ μ΅μ§ μμ ν λ§ν λ€μ μ΅μ ν λ§ν μ μν₯μ λ°μ μ΅κ² λλ€.
νλμ ν λ§ν μ μΈμ ν κ³³μ μΌμͺ½, μ€λ₯Έμͺ½, μ, λ€ λ€ λ°©ν₯μ μλ ν λ§ν λ₯Ό μλ―Ένλ€.
λκ°μ λ°©ν₯μ μλ ν λ§ν λ€μκ²λ μν₯μ μ£Όμ§ λͺ»νλ©°, ν λ§ν κ° νΌμ μ μ λ‘ μ΅λ κ²½μ°λ μλ€κ³ κ°μ νλ€.
μ² μλ μ°½κ³ μ 보κ΄λ ν λ§ν λ€μ΄ λ©°μΉ μ΄ μ§λλ©΄ λ€ μ΅κ² λλμ§, κ·Έ μ΅μ μΌμλ₯Ό μκ³ μΆμ΄ νλ€.
ν λ§ν λ₯Ό μ°½κ³ μ 보κ΄νλ 격μλͺ¨μμ μμλ€μ ν¬κΈ°μ μ΅μ ν λ§ν λ€κ³Ό μ΅μ§ μμ ν λ§ν λ€μ μ λ³΄κ° μ£Όμ΄μ‘μ λ, λ©°μΉ μ΄ μ§λλ©΄ ν λ§ν λ€μ΄ λͺ¨λ μ΅λμ§, κ·Έ μ΅μ μΌμλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νλΌ.
λ¨, μμμ μΌλΆ μΉΈμλ ν λ§ν κ° λ€μ΄μμ§ μμ μλ μλ€.
μ λ ₯
첫 μ€μλ μμμ ν¬κΈ°λ₯Ό λνλ΄λ λ μ μ M, Nμ΄ μ£Όμ΄μ§λ€.
Mμ μμμ κ°λ‘ μΉΈμ μ, Nμ μμμ μΈλ‘ μΉΈμ μλ₯Ό λνλΈλ€. λ¨, 2 ≤ M, N ≤ 1,000μ΄λ€.
λμ§Έ μ€λΆν°λ νλμ μμμ μ μ₯λ ν λ§ν λ€μ μ λ³΄κ° μ£Όμ΄μ§λ€.
μ¦, λμ§Έ μ€λΆν° Nκ°μ μ€μλ μμμ λ΄κΈ΄ ν λ§ν μ μ λ³΄κ° μ£Όμ΄μ§λ€.
νλμ μ€μλ μμ κ°λ‘μ€μ λ€μ΄μλ ν λ§ν μ μνκ° Mκ°μ μ μλ‘ μ£Όμ΄μ§λ€.
μ μ 1μ μ΅μ ν λ§ν , μ μ 0μ μ΅μ§ μμ ν λ§ν , μ μ -1μ ν λ§ν κ° λ€μ΄μμ§ μμ μΉΈμ λνλΈλ€.
ν λ§ν κ° νλ μ΄μ μλ κ²½μ°λ§ μ
λ ₯μΌλ‘ μ£Όμ΄μ§λ€.
μΆλ ₯
μ¬λ¬λΆμ ν λ§ν κ° λͺ¨λ μ΅μ λκΉμ§μ μ΅μ λ μ§λ₯Ό μΆλ ₯ν΄μΌ νλ€.
λ§μ½, μ μ₯λ λλΆν° λͺ¨λ ν λ§ν κ° μ΅μ΄μλ μνμ΄λ©΄ 0μ μΆλ ₯ν΄μΌ νκ³ , ν λ§ν κ° λͺ¨λ μ΅μ§λ λͺ»νλ μν©μ΄λ©΄ -1μ μΆλ ₯ν΄μΌ νλ€.
μ μΆλ ₯ μμ 1
μ λ ₯
6 4
1 -1 0 0 0 0
0 -1 0 0 0 0
0 0 0 0 -1 0
0 0 0 0 -1 1
μΆλ ₯
6
μ μΆλ ₯ μμ 2 ( ν λ§ν κ° λͺ¨λ μ΅μ§ λͺ»νλ μν )
μ λ ₯
6 4
0 -1 0 0 0 0
-1 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1
μΆλ ₯
-1
μ μΆλ ₯ μμ 3 ( μ μ₯λ λλΆν° ν λ§ν κ° λͺ¨λ μ΅μ΄μλ μν )
μ λ ₯
2 2
1 -1
-1 1
μΆλ ₯
0
λ¬Έμ νμ΄ κ³Όμ
μμλ₯Ό ν΅ν΄ λ¬Έμ μ΄ν΄νκΈ°
μμ 1μ μ΄ν΄λ³΄μ.
Day 0 (μ²μ μν)
1 -1 0 0 0 0
0 -1 0 0 0 0
0 0 0 0 -1 0
0 0 0 0 -1 1
Day 1
1 -1 0 0 0 0
1 -1 0 0 0 0
0 0 0 0 -1 1
0 0 0 0 -1 1
Day 2
1 -1 0 0 0 0
1 -1 0 0 0 1
1 0 0 0 -1 1
0 0 0 0 -1 1
Day 3
1 -1 0 0 0 1
1 -1 0 0 1 1
1 1 0 0 -1 1
1 0 0 0 -1 1
Day 4
1 -1 0 0 1 1
1 -1 0 1 1 1
1 1 1 0 -1 1
1 1 0 0 -1 1
Day 5
1 -1 0 1 1 1
1 -1 1 1 1 1
1 1 1 1 -1 1
1 1 1 0 -1 1
Day 6
1 -1 1 1 1 1
1 -1 1 1 1 1
1 1 1 1 -1 1
1 1 1 1 -1 1
μ΄λ¬ν κ³Όμ μ κ±°μ³μ ν λ§ν κ° λͺ¨λ μ΅λ λ°μλ 6μΌμ΄ κ±Έλ¦°λ€.
νλ£¨κ° μ§λ λλ§λ€ ν λ§ν μ μνμ’μ°λ‘ ν μΉΈμ©μ ν λ§ν κ° λͺ¨λ μ΅κ² λλ€.
μ΄λ₯Ό ν΅ν΄ μ΄ λ¬Έμ μμλ BFSμ κ°λ μ΄ μ°μ΄λ κ²μ μ μ μλ€.
ν΄λΉ κ°λ μ λν΄ μμΈν μκ³ μΆλ€λ©΄ μ°Έκ³ νκΈΈ λ°λλ€.
[μκ³ λ¦¬μ¦] BFS
BFSλ? Breadth First Search, λλΉ μ°μ νμ κ°κΉμ΄ λ ΈλλΆν° νμνλ μκ³ λ¦¬μ¦ λμ κ³Όμ 1. νμ μμ λ Έλλ₯Ό νμ μ½μ νκ³ λ°©λ¬Έ μ²λ¦¬λ₯Ό νλ€. 2. νμμ λ Έλλ₯Ό κΊΌλ΄ ν΄λΉ λ Έλμ μΈμ λ Έλ μ€μμ
hyeon-z.tistory.com
μ λ ₯ κ° μ μ₯νκΈ°
μ΄ 4κ°μ§ μμλ₯Ό μ μΈν΄μΌ νλ€.
1. μμμ λ΄κΈ΄ ν λ§ν λ₯Ό μ μ₯ν λ°°μ΄ (board)
2. BFS ꡬνμ μν΄ μ°μΌ ν (queue)
3. μμμ κ°λ‘ μΉΈμ μ (M)
4. μμμ μΈλ‘ μΉΈμ μ (N)
public class BOJ_7576 {
static int[][] board;
static Queue<Tomato> queue;
static int N, M;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
queue = new LinkedList<>();
M = Integer.parseInt(st.nextToken()); // κ°λ‘
N = Integer.parseInt(st.nextToken()); // μΈλ‘
board = new int[N][M];
// ν λ§ν μΉΈ μ
λ ₯ λ°κΈ°
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
if (board[i][j] == 1) {
queue.offer(new Tomato(i, j));
}
}
}
}
}
ν λ§ν μΉΈμ μ λ ₯λ°μΌλ©΄μ ν΄λΉ μΉΈμ ν λ§ν κ° μ΅μ΄μλ κ²½μ° νμ μΆκ°νλ€.
ν λ§ν ν΄λμ€ κ΅¬ν
ν λ§ν μ μμΉλ₯Ό μ μ₯νκΈ° μν΄μλ ν΄λΉ ν λ§ν μ xμ’ν, yμ’νλ₯Ό μ μ₯ν΄μΌ νλ€.
κ·Έλ₯Ό μν΄ xμ’νμ yμ’νλ₯Ό κ°μ§λ ν λ§ν ν΄λμ€λ₯Ό ꡬννλ€.
class Tomato {
int x;
int y;
Tomato(int x, int y) {
this.x = x;
this.y = y;
}
}
bfs λ©μλ ꡬν
public static int bfs() {
// μνμ’μ°
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};
int day = 0;
int size = queue.size();
while (!queue.isEmpty()) {
for (int i = 0; i < size; i++) {
Tomato tomato = queue.poll();
int x = tomato.x;
int y = tomato.y;
for (int j = 0; j < 4; j++) {
int nx = x + dx[j];
int ny = y + dy[j];
if (nx < 0 || nx > N - 1 || ny < 0 || ny > M - 1) {
continue;
}
if (board[nx][ny] == 0) {
board[nx][ny] = 1;
queue.offer(new Tomato(nx, ny));
}
}
}
size = queue.size();
day += 1;
}
if (checkTomato()) return day - 1;
return -1;
}
ν루 λμ ν λ§ν λ₯Ό νμνλ κ³Όμ μ μ΄ν΄λ³΄μ.
1. νμ 맨 μμ μ‘΄μ¬νλ ν λ§ν λ₯Ό μ κ±°νλ€.
2. ν΄λΉ ν λ§ν μ μνμ’μ°λ₯Ό νμΈνλ©° λ²μ λ΄μ μ’νμΈμ§ νμΈνλ€.
3. 2μ 쑰건μ λ§μ‘±νκ³ μΉΈμ κ°μ΄ 0μΈ κ²½μ° μΉΈμ κ°μ 1λ‘ λ°κΎΌ ν νμ λ£λλ€. μ¦ ν λ§ν λ₯Ό μ΅νλ€.
4. νμ λ€μ΄κ° μλ ν λ§ν κ°μ μ¦ νμ μ¬μ΄μ¦λ§νΌ 1, 2, 3 κ³Όμ μ λ°λ³΅νλ€.
5. νμ μ¬μ΄μ¦λ₯Ό μλ‘ μ μ₯νλ€.
6. λ μ§λ₯Ό ν루 λνλ€.
μμμ μ€λͺ νλ μμμ ν¨κ» μ’ λ μμΈν μ΄ν΄λ³΄μ.
λͺ¨λ κ³Όμ μ νκ° λΉκ² λλ©΄ μ’ λ£λλ€.
μ²μ ν λ§ν μΉΈμ μ λ ₯λ°μΌλ©΄μ μ΅μ΄μλ ν λ§ν μ κ²½μ° queueμ λ£λλ€.
Day 0 (μ²μ μν)
1 -1 0 0 0 0
0 -1 0 0 0 0
0 0 0 0 -1 0
0 0 0 0 -1 1
Day 0μ νμ (0, 0), (3, 5)κ° λ΄κΈ΄λ€.
Day 0μ νμ sizeλ§νΌ forλ¬Έμ λλ©° ν λ§ν μ μνμ’μ°λ₯Ό νμΈν ν ν λ§ν λ€μ μ΅νλ©΄ νλ£¨κ° μ§λκ°λ€.
Day 1
1 -1 0 0 0 0
1 -1 0 0 0 0
0 0 0 0 -1 1
0 0 0 0 -1 1
Day 1μ νμλ Day 0μ νμ μνμ’μ°μ κ°μ΄ 0μΈ κ²½μ°μ ν΄λΉλλ μ’νμΈ (1, 0), (2, 5)κ° λ΄κΈ΄λ€.
μ΄λ¬ν κ³Όμ μ΄ λ°λ³΅λκ³ Day 6μ΄ λλ€.
Day 6
1 -1 1 1 1 1
1 -1 1 1 1 1
1 1 1 1 -1 1
1 1 1 1 -1 1
μΆκ°λ ν λ§ν λ€μ μνμ’μ°μ λ μ΄μ μ΅ν ν λ§ν κ° μμΌλ―λ‘ νκ° λΉκ² λμ΄ whileλ¬Έμ΄ μ’ λ£λλ€.
μΆλ ₯ν λ ν λ§ν μΉΈμ 체ν¬νλ λ©μλ ꡬν
μμ μΆλ ₯μ 보면 ν΄λΉ μ‘°κ±΄μ΄ μ‘΄μ¬νλ€.
ν λ§ν κ° λͺ¨λ μ΅μ§λ λͺ»νλ μν©μ΄λ©΄ -1μ μΆλ ₯ν΄μΌ νλ€.
static boolean checkTomato() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (board[i][j] == 0) {
return false;
}
}
}
return true;
}
ν λ§ν μΉΈμ λλ©΄μ μ΅μ§ μμ ν λ§ν κ° μ‘΄μ¬νλ κ²½μ° falseλ₯Ό return νκ³ κ·Έ μΈμ κ²½μ° trueλ₯Ό return νλ€.
bfs λ©μλ λ§λ¬΄λ¦¬
μμ bfs λ©μλμμ μ€λͺ νμ§ μκ³ λμ΄κ° λΆλΆμ΄ μλ€.
if (checkTomato()) return day - 1;
return -1;
whileλ¬Έμ΄ μ’ λ£λ ν ν λ§ν μΉΈμ 체ν¬ν΄μΌ νλ€.
ν΄λΉ ν¨μκ° trueμΈ κ²½μ°, λͺ¨λ ν λ§ν κ° μ΅μ μνμ΄κΈ° λλ¬Έμ day - 1μ return νλ€.
κ·Έ μΈμ κ²½μ°μλ ν λ§ν κ° λͺ¨λ μ΅μ§ λͺ»νλ μν©μ΄λ―λ‘ -1μ return νλ€.
μ dayκ° μλ day - 1μ return ν κΉ?
μμ μμμμ Day 6μΌ λ queueμλ λ§μ§λ§μΌλ‘ μ΅μ 2κ°μ ν λ§ν κ° λ€μ΄μλ€. μ΄λ λͺ¨λ ν λ§ν κ° μ΅κ² λμ§λ§ κ·Έλ₯Ό νμΈνκΈ° μν΄ νλ² λ λ°λ³΅λ¬Έμ΄ λκ² λλ€. μ€μ§μ μΌλ‘ ν λ§ν κ° λͺ¨λ μ΅μ μκ°μ λ§μ§λ§ λ°λ³΅λ¬Έμ΄ λκΈ° μ μ λ μ΄κΈ° λλ¬Έμ day - 1μ return νλ€.
λν κ³ λ €ν΄μΌν μΆλ ₯ μ‘°κ±΄μ΄ νλ λ μλ€.
μ μ₯λ λλΆν° λͺ¨λ ν λ§ν κ° μ΅μ΄μλ μνμ΄λ©΄ 0μ μΆλ ₯ν΄μΌ νλ€.
μ½λλ₯Ό μΆκ°νμ§ μμλ 0μ΄ μΆλ ₯λλ―λ‘ κ·Έλλ‘ κ΅¬νμ λ§λ¬΄λ¦¬νλ€.
μ΅μ’ μ½λ
public class BOJ_7576 {
static int[][] board;
static Queue<Tomato> queue;
static int N, M;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
queue = new LinkedList<>();
M = Integer.parseInt(st.nextToken()); // κ°λ‘
N = Integer.parseInt(st.nextToken()); // μΈλ‘
board = new int[N][M];
// ν λ§ν μΉΈ μ
λ ₯ λ°κΈ°
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
if (board[i][j] == 1) {
queue.offer(new Tomato(i, j));
}
}
}
System.out.println(bfs());
}
public static int bfs() {
// μνμ’μ°
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};
int day = 0;
int size = queue.size();
while (!queue.isEmpty()) {
for (int i = 0; i < size; i++) {
Tomato tomato = queue.poll();
int x = tomato.x;
int y = tomato.y;
for (int j = 0; j < 4; j++) {
int nx = x + dx[j];
int ny = y + dy[j];
if (nx < 0 || nx > N - 1 || ny < 0 || ny > M - 1) {
continue;
}
if (board[nx][ny] == 0) {
board[nx][ny] = 1;
queue.offer(new Tomato(nx, ny));
}
}
}
size = queue.size();
day += 1;
}
if (checkTomato()) return day - 1;
return -1;
}
static boolean checkTomato() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (board[i][j] == 0) {
return false;
}
}
}
return true;
}
}
'π―PS - Baekjoon, etc > BFS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
π₯[λ°±μ€, 1260] DFSμ BFS (Java) (0) | 2023.04.18 |
---|---|
[μ΄κ²μ΄ μ½λ© ν μ€νΈλ€] λ―Έλ‘ νμΆ (0) | 2023.03.28 |
λκΈ