μκ³ λ¦¬μ¦
[Java] BOJ 7576 ν λ§ν
πκ·€π
2024. 9. 2. 15:53
λ¬Έμ
λ¬Έμ λ§ν¬ https://www.acmicpc.net/problem/7576
- μ² μμ ν λ§ν λμ₯μμλ ν λ§ν λ₯Ό 보κ΄νλ ν° μ°½κ³ λ₯Ό κ°μ§κ³ μλ€. ν λ§ν λ μλμ κ·Έλ¦Όκ³Ό κ°μ΄ 격μ λͺ¨μ μμμ μΉΈμ νλμ© λ£μ΄μ μ°½κ³ μ 보κ΄νλ€.
- μ°½κ³ μ 보κ΄λλ ν λ§ν λ€ μ€μλ μ μ΅μ κ²λ μμ§λ§, μμ§ μ΅μ§ μμ ν λ§ν λ€λ μμ μ μλ€.
- λ³΄κ΄ ν νλ£¨κ° μ§λλ©΄, μ΅μ ν λ§ν λ€μ μΈμ ν κ³³μ μλ μ΅μ§ μμ ν λ§ν λ€μ μ΅μ ν λ§ν μ μν₯μ λ°μ μ΅κ² λλ€.
- νλμ ν λ§ν μ μΈμ ν κ³³μ μΌμͺ½, μ€λ₯Έμͺ½, μ, λ€ λ€ λ°©ν₯μ μλ ν λ§ν λ₯Ό μλ―Ένλ€. λκ°μ λ°©ν₯μ μλ ν λ§ν λ€μκ²λ μν₯μ μ£Όμ§ λͺ»νλ©°, ν λ§ν κ° νΌμ μ μ λ‘ μ΅λ κ²½μ°λ μλ€κ³ κ°μ νλ€.
- μ² μλ μ°½κ³ μ 보κ΄λ ν λ§ν λ€μ΄ λ©°μΉ μ΄ μ§λλ©΄ λ€ μ΅κ² λλμ§, κ·Έ μ΅μ μΌμλ₯Ό μκ³ μΆμ΄ νλ€.
- ν λ§ν λ₯Ό μ°½κ³ μ 보κ΄νλ 격μλͺ¨μμ μμλ€μ ν¬κΈ°μ μ΅μ ν λ§ν λ€κ³Ό μ΅μ§ μμ ν λ§ν λ€μ μ λ³΄κ° μ£Όμ΄μ‘μ λ, λ©°μΉ μ΄ μ§λλ©΄ ν λ§ν λ€μ΄ λͺ¨λ μ΅λμ§, κ·Έ μ΅μ μΌμλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νλΌ.
- λ¨, μμμ μΌλΆ μΉΈμλ ν λ§ν κ° λ€μ΄μμ§ μμ μλ μλ€.
- 첫 μ€μλ μμμ ν¬κΈ°λ₯Ό λνλ΄λ λ μ μ M,Nμ΄ μ£Όμ΄μ§λ€.
- Mμ μμμ κ°λ‘ μΉΈμ μ, Nμ μμμ μΈλ‘ μΉΈμ μλ₯Ό λνλΈλ€. λ¨, 2 ≤ M,N ≤ 1,000 μ΄λ€.
- λμ§Έ μ€λΆν°λ νλμ μμμ μ μ₯λ ν λ§ν λ€μ μ λ³΄κ° μ£Όμ΄μ§λ€.
- μ¦, λμ§Έ μ€λΆν° Nκ°μ μ€μλ μμμ λ΄κΈ΄ ν λ§ν μ μ λ³΄κ° μ£Όμ΄μ§λ€. νλμ μ€μλ μμ κ°λ‘μ€μ λ€μ΄μλ ν λ§ν μ μνκ° Mκ°μ μ μλ‘ μ£Όμ΄μ§λ€.
- μ μ 1μ μ΅μ ν λ§ν , μ μ 0μ μ΅μ§ μμ ν λ§ν , μ μ -1μ ν λ§ν κ° λ€μ΄μμ§ μμ μΉΈμ λνλΈλ€.
- ν λ§ν κ° νλ μ΄μ μλ κ²½μ°λ§ μ λ ₯μΌλ‘ μ£Όμ΄μ§λ€.
- μ¬λ¬λΆμ ν λ§ν κ° λͺ¨λ μ΅μ λκΉμ§μ μ΅μ λ μ§λ₯Ό μΆλ ₯ν΄μΌ νλ€. λ§μ½, μ μ₯λ λλΆν° λͺ¨λ ν λ§ν κ° μ΅μ΄μλ μνμ΄λ©΄ 0μ μΆλ ₯ν΄μΌ νκ³ , ν λ§ν κ° λͺ¨λ μ΅μ§λ λͺ»νλ μν©μ΄λ©΄ -1μ μΆλ ₯ν΄μΌ νλ€.
μμ΄λμ΄
- 3μ°¨μ ν λ§ν λ λΉμ·νκ² νμλ€.
- BFSλ₯Ό μ¨μ νμλλ° μ΄ λ¬Έμ λ x,yμ’νλ‘ μνμ’μ° νμλ§ νλ©΄ λΌμ μ’ λ κ°λ¨ν ν μ μμλ€.
- μ λ ₯μ λ°μ λλ§λ€ κ°μ΄ 1μΌ κ²½μ°, Queueμ Pointλ₯Ό μ¬μ©νμ¬ ν΄λΉ μ’νλ₯Ό λ£λλ€.
- Queueμ μλ μ’νκ°μ κ°μλ§νΌ λ°λ³΅λ¬Έμ λμ μλ‘κ² μ΅μ ν λ§ν μ μ’νλ₯Ό Queueμ λ£λλ€. (κΈ°μ‘΄μ Queueμ μλ κ°μλ§νΌ λ°λ³΅λ¬Έμ΄ λκΈ°λλ¬Έμ μλ‘κ² Queueμ λ€μ΄κ° μ’νκ°μ λ μ§κ° λμ΄κ°κ³ μλ‘μ΄ λ°λ³΅λ¬Έμμ μ¬μ©λλ€.)
- λ°λ³΅λ¬Έμ λλ©° μλ‘κ² μΆκ°λ ν λ§ν μ’νκ° μλ€λ©΄ λ μ§λ₯Ό + 1μν€κ³ whileλ¬Έμ ν΅ν΄ μ΅μ’ μ μΌλ‘ Queueκ° λΉ λκΉμ§ λ°λ³΅νλ€.
- μΆλ ₯ν λλ, μ λ ₯λ°μ λλΆν° μ΅νμΌλλ ν λ§ν κ° μμλ€λ©΄ λ°λ‘ 0μ μΆλ ₯νκ³ μλ κ²½μ°, μ’νλ₯Ό λλ©° λ¨μ 0μ΄ μλ€λ©΄ -1, μλ€λ©΄ κ³μ°λ λ μ§ μλ₯Ό μΆλ ₯νλ€.
κ²ͺμ μνμ°©μ€
- X
μ½λ
import java.awt.*;
import java.io.*;
import java.util.*;
public class BOJ7576 {
static int M;
static int N;
static int map[][];
static boolean visited[][];
static int dx[] = {-1, 1, 0, 0};
static int dy[] = {0, 0, -1, 1};
static int days;
static Queue<Point> q = new LinkedList<>();
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// ν
M = Integer.parseInt(st.nextToken());
// μ΄
N = Integer.parseInt(st.nextToken());
// μ΅μ΄μΌλλ ν λ§ν κ° μλμ§ νλ¨ν λ³μ
boolean isTomato = false;
// ν λ§ν μ μ₯ν λ°°μ΄
map = new int[N][M];
// λ°©λ¬Έ μ¬λΆ μ μ₯ν λ°°μ΄
visited = new boolean[N][M];
// κ³μ°ν λ μ§ λ³μ
days = 0;
// ν λ§ν μ
λ ₯
for(int i = 0; i < N; i++){
StringTokenizer st2 = new StringTokenizer(br.readLine());
for(int j = 0; j < M; j++){
int n = Integer.parseInt(st2.nextToken());
// λ§μ½ μ
λ ₯μ΄ 0μ΄λΌλ©΄ μ΅νμΌλλ ν λ§ν κ° μλ€λ λ»μ΄λ―λ‘
// λ³μλ₯Ό trueλ‘ λ°κΏμ€
if(n == 0){
isTomato = true;
}
// μ
λ ₯μ΄ 1μ΄λ©΄ ν λ§ν κ° μλ€λ λ»μ΄λ―λ‘ Queueμ
// ν΄λΉ μμΉλ₯Ό λ£μ΄μ£Όκ³ λ°©λ¬Έμ²λ¦¬
if(n == 1){
q.offer(new Point(i, j));
visited[i][j] = true;
}
map[i][j] = n;
}
}
if(!isTomato){
System.out.println(0);
}
else{
// λͺ¨λ μ΅ν μ μλ μν©μΈμ§ νλ¨ν λ³μ
boolean TF = true;
BFS();
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
// λ§μ½ BFSλ₯Ό λλ Έλλ° μμ§ 0μ΄ μλ€λ©΄
// λͺ¨λ λͺ» μ΅νμΌλ―λ‘ TFλ₯Ό falseλ‘ λ°κΎΈκ³ λ°λ³΅λ¬Έ μ’
λ£
if(map[i][j] == 0){
TF = false;
break;
}
}
}
// λ§μ½ TFκ° trueμ΄λ©΄ λͺ¨λ μ΅ν μ μλ€λ λ»μ΄λ―λ‘ λ μ§ μΆλ ₯
if(TF){
System.out.println(days);
}
// TFκ° falseλΌλ©΄ λͺ¨λ μ΅ν μ μλ€λ λ»μ΄λ―λ‘ -1 μΆλ ₯
else{
System.out.println(-1);
}
}
}
public static void BFS(){
// Queueκ° λΉλκΉμ§ λ°λ³΅
while(!q.isEmpty()){
// Queueμ ν¬κΈ°
int size = q.size();
// μλ‘μ΄ ν λ§ν κ° μκ²Όλμ§ νλ¨ν λ³μ
boolean change = false;
// κΈ°μ‘΄μ Queue ν¬κΈ°λ§νΌ λ°λ³΅
for(int i = 0; i < size; i++){
int xx = q.peek().x;
int yy = q.peek().y;
q.poll();
// Queueμμ κΊΌλΈ μ’νλ₯Ό κΈ°μ€μΌλ‘
// μνμ’μ°λ‘ μ΄λ
for(int j = 0; j < 4; j++){
int nx = xx + dx[j];
int ny = yy + dy[j];
// μ΄λν μ’νκ° λ²μλ₯Ό μ΄κ³Όνλ€λ©΄ continue
if(nx >= N || nx < 0 || ny >= M || ny < 0){
continue;
}
// λ§μ½ μ΄λν μ’νκ° 0μ΄κ³ λ°©λ¬Ένμ§ μμλ€λ©΄
if((map[nx][ny] == 0) && !visited[nx][ny]){
// ν΄λΉμ’νλ₯Ό 1λ‘ λ°κΎΈκ³
map[nx][ny] = 1;
// λ°©λ¬Έμ²λ¦¬λ₯Ό ν ν,
visited[nx][ny] = true;
// Queueμ λ£μ
q.offer(new Point(nx, ny));
// κ·Έλ¦¬κ³ μλ‘μ΄ ν λ§ν κ° μκ²ΌμΌλ―λ‘ trueλ‘ λ°κΏ
change = true;
}
}
}
// κ·Έλ¦¬κ³ μλ‘μ΄ ν λ§ν κ° μκ²ΌμΌλ©΄ λ μ§ + 1
if(change){
days = days + 1;
}
}
}
}