https://www.acmicpc.net/problem/7576
โ๏ธ ๋ฌธ์
๐ ๋ฌธ์ ํด๊ฒฐ
์ด ๋ฌธ์ ๋ ๋ฏธ๋ก ํ์ ๋ฌธ์ ์ฒ๋ผ ํ๋ฉด ๋๋ค.
๋์ ์ด ๋ฌธ์ ์์ ์ฃผ์ํด์ผํ ์ ์ ๋ฏธ๋ก ํ์ ๋ฌธ์ ์ฒ๋ผ ํ๊ณณ์์ ์ถ๋ฐํ๋๊ฒ ์๋๋ผ, ์์์ ์ด ์ฌ๋ฌ์ง์ ์ด๋ผ๋ ์ ์ด๋ค.
์ด๊ฒ ๋๋ฌธ์ ๋จธ๋ฆฌ ์ํ ๋๋ฐ ์๊ฐํด๋ณด๋ฉด ๊ทธ๋ฆฌ ์ด๋ ต์ง ์๋ค.
์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์ดํด๋ณด์.
int[][] days = new int[N][M];
int[][] tomatos = new int[N][M];
// N, M ์ฃผ์! ์ฐ๋ฆฌ๋ M์ ํ, N์ ์ด๋ก ์ฌ์ฉ!
for(int i=0; i<M; i++){
st = new StringTokenizer(bf.readLine();
for(int j=0; j<N; j++){
int num = Integer.parseInt(st.nextToken());
tomatos[i][j] = num;
// 1(์ต์ ํ ๋งํ )์ด๋ฉด ํ์ ๋ฃ์ด์ค๋ค!
if( num == 1 ){
qu.offer(new Pair(i, j));
days[i][j] = 0;
}else{
days[i][j] = -1;
}
}
}
๋จผ์ ์ต์ ํ ๋งํ (1)์ผ๋๋ ํ์ ๋ฃ์ด์ค๋ค! (์์์ ์ธํ ).
๊ทธ๋ฆฌ๊ณ , ์ต์ง ์์์ผ๋ฉด days[i][j]์ -1๊ฐ์ ๋ฃ์ด์ค๋ค. -> ๋์ค์ ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ํ์ธํ๊ธฐ ์ํด์
๊ฐ์ฅ ํต์ฌ์ด ๋๋ ์ฝ๋์ด๋ค!
์ต์ ํ ๋งํ ์,ํ,์ข,์ฐ์ ์ต์ง ์์ ํ ๋งํ ๊ฐ ์๋ค๋ฉด ํ ๋งํ ๋ฅผ ์ต์ ์ํ๋ก ๋ฐ๊พธ๊ณ , ํด๋น days์ ๊ฐ์ +1ํด์ ๋ฃ์ด์ค๋ค!!
์๋ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
while(!qu.isEmpty()){
Pair p = qu.poll();
// ์ํ์ข์ฐ ์ํ
for(int i=0; i<4; i++){
int nX = p.x + dx[i];
int nY = p.y + dy[i];
if(nX <0 || nX >= N || nY < 0 || nY >= M){
continue;
}
// ํ ๋งํ ๊ฐ ์๊ฑฐ๋, ์ด๋ฏธ ๋ฐฉ๋ฌธํ์ผ๋ฉด PASS!
if(tomatos[nX][nY] == -1 || days[nX][nY] != -1){
continue;
}
// ์ต์ ํ ๋งํ ๋ฅผ ํ์ ๋ฃ์ด์ฃผ๊ณ , ์์ต์ ํ ๋งํ ์ ๊ฐ์ -1
qu.offer(new Pair(nX, nY)); notYet--;
// ๋ ์ง๋ฅผ +1 ํ์ฌ ๋ฃ์ด์ค๋๋ค.
days[nX][nY] = days[p.x][p.y] + 1;
// ํด๋น ๋ ์ง๊ฐ ์ต์ข
๋ ์ง์ธ์ง ๊ตฌ๋ถ
if(result < days[nX][nY]){
result = days[nX][nY];
}
}
}
๋ฏธ๋ฆฌ ๋ฃ์ด์คฌ๋ ์ต์ ํ ๋งํ ๋ฅผ ํ์์ ์ฐจ๋ก๋๋ก ๊บผ๋ด๋ฉด์, ํด๋น ํ ๋งํ ์ ์,ํ,์ข,์ฐ๋ฅผ ํ์ํด์ ์์ต์ ํ ๋งํ ๊ฐ ์๋ค๋ฉด ํ์ ๋ฃ์ด์ฃผ๊ณ , ํด๋น ํ ๋งํ ์ ๋ ์ง๋ฅผ ์์ ์ ์ตํ๊ฒ ํ๋ ํ ๋งํ (?)์ ๋ ์ง + 1 ํ ๊ฐ์ ๋ฃ์ด์ค๋ค! (๋ง์ด ์ด์ํ๋ฐ ์ ์ดํดํด๋ณด์..)
๐ฅ ์ ์ฒด ์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int result = 0; // ์ต์ข
๋ ์ง
int notYet = 0; // ์์ต์ ํ ๋งํ
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
int[][] days = new int[N][M]; // ๋ ์ง๋ฅผ ์ ์ฅํ 2์ฐจ์๋ฐฐ์ด
int[][] tomatos = new int[N][M]; // ํ ๋งํ ์ ์ํ๋ฅผ ์ ์ฅํ 2์ฐจ์๋ฐฐ์ด
Queue<Pair> qu = new LinkedList<>();
int[] dx = {1, 0 , -1, 0}; // ์ํ์ข์ฐ ์ขํ ๊ณ์ฐ์ ์ํ ๋ฐฐ์ด
int[] dy = {0, 1, 0, -1};
// ํ ๋งํ ์ํ ์
๋ ฅ
for(int i=0; i<N; i++){
st = new StringTokenizer(bf.readLine());
for(int j=0; j<M; j++){
days[i][j] = -1; // ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ์ํด -1๋ก ์ด๊ธฐํ
int num = Integer.parseInt(st.nextToken());
tomatos[i][j] = num;
if(num == 1){
qu.offer(new Pair(i, j)); // ์ต์ ํ ๋งํ ๋ง ํ์ ๋ฃ์ด์ค๋ค.
days[i][j] = 0; // ํด๋น ๋ ์ง 0์ผ์ผ๋ก ์ธํ
}else if(num == 0){
notYet++; // ์ต์ง ์์ ํ ๋งํ +1
}
}
}
// ์์ต์ ํ ๋งํ ๊ฐ ์๋ค๋ฉด ์ข
๋ฃ.
if(notYet == 0){
System.out.print(0);
System.exit(0);
}
// ์ต์ ํ ๋งํ ๊ฐ ๋ง์ฝ n๊ฐ ์ผ๋, ๊ฑธ๋ฆฐ ๋ ์ง / n ์ธ๊ฐ?
while(!qu.isEmpty()){
Pair p = qu.poll();
// ์ํ์ข์ฐ ์ํ
for(int i=0; i<4; i++){
int nX = p.x + dx[i];
int nY = p.y + dy[i];
if(nX <0 || nX >= N || nY < 0 || nY >= M){
continue;
}
// ํ ๋งํ ๊ฐ ์๊ฑฐ๋, ์ด๋ฏธ ๋ฐฉ๋ฌธํ์ผ๋ฉด PASS!
if(tomatos[nX][nY] == -1 || days[nX][nY] != -1){
continue;
}
// ์ต์ ํ ๋งํ ๋ฅผ ํ์ ๋ฃ์ด์ฃผ๊ณ , ์์ต์ ํ ๋งํ ์ ๊ฐ์ -1
qu.offer(new Pair(nX, nY)); notYet--;
// ๋ ์ง๋ฅผ +1 ํ์ฌ ๋ฃ์ด์ค๋๋ค.
days[nX][nY] = days[p.x][p.y] + 1;
// ํด๋น ๋ ์ง๊ฐ ์ต์ข
๋ ์ง์ธ์ง ๊ตฌ๋ถ
if(result < days[nX][nY]){
result = days[nX][nY];
}
}
}
// ๋ง์ฝ ์์ง๋ ์ต์ง ์์ ํ ๋งํ ๊ฐ ์๋ค๋ฉด -1 ์ถ๋ ฅ!
if(notYet > 0){
System.out.print(-1);
}else{
System.out.print(result);
}
}
public static class Pair{
int x, y;
public Pair(int x, int y){
this.x = x;
this.y = y;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
public void setX(int x){
this.x = x;
}
public void setY(int y){
this.y = y;
}
}
}