https://www.acmicpc.net/problem/1926
BFS์ ๊ฐ๋ ์ ๊ฐ์ฅ ์ ์ดํดํ ์ ์๋ ๋ฌธ์ ๋ผ๊ณ ํ ์ ์๋ค. ์ฐจ๊ทผ์ฐจ๊ทผ ํ๋ฒ ํ์ด๋ณด๋๋ก ํ์.
โ๏ธ ๋ฌธ์
๐ ๋ฌธ์ ํด๊ฒฐ
๊ฐ์ด 1์ด๋ฉด ์์น ์ด ๋ ๋ถ๋ถ์ด๋๊น, ๋ชจ๋ ๊ทธ๋ฆผ์ ์ ๋ถ ๋๋ฉด์ 1์ด๊ฑฐ๋ ๋ฐฉ๋ฌธํ์ง ์์ ๊ทธ๋ฆผ์ ์ฒดํฌํ๋ฉด์ ์ฒ๋ฆฌํด์ฃผ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
์ฐ์ ๋ชจ๋ ๊ทธ๋ฆผ์ 2์ฐจ์ ๋ฐฐ์ด์ ๋ด์์ฃผ๋๋ก ํ๋ค. (StringTokenizer๋ฅผ ์ด์ฉํด์ ๊ฐ๊ฐ ์์๋ฅผ ๋ฃ์ด์ค๋ค.)
arr = new int[n][m];
// ๋ฐฐ์ด๊ฐ ์ธํ
for(int i=0; i<n; i++){
st = new StringTokenizer(bf.readLine());
for(int j=0; j<m; j++){
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
๊ทธ๋ผ ์ด์ ๋ชจ๋ ๋ฐฐ์ด์ ์์๋ค์ ์ํํ๋ฉด์, 0 ์ด๊ฑฐ๋ ๋ฐฉ๋ฌธํ ๊ทธ๋ฆผ๋ค์ ๊ฑด๋๋ฐ์ด์ฃผ๋๋ก ํ๋ค.
๊ทธ๋ฆฌ๊ณ , ๋ฐฉ๋ฌธํ์ง ์์๊ฑฐ๋ 1(์์น )์ธ ๊ทธ๋ฆผ์ ํ์ ๋ฃ์ด์ ์ฐ๊ฒฐ๋ ๊ทธ๋ฆผ์ ์ฐพ๋๋ก ํ ๊ฑด๋ฐ, ์ด๋ ์ค์ํ ์ ์ ํ(Queue)๋ฅผ ์ด์ฉํ์ฌ ์ฐ๊ฒฐ๋ ๊ทธ๋ฆผ์ ์ฐพ๊ฒ ํ ๊ฒ์ด๋ค. ์ด๋ป๊ฒ ํ๋๋.. ํ์ ๋จผ์ ๋ฃ์๋ ์์๋ ํด๋น ๊ทธ๋ฆผ์ ์ฒซ๋ฒ์งธ ์์์ ์ด ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ฒซ๋ฒ์งธ ์์์ ์ ๊ฐ์ง๊ณ ์, ์๋, ์ค๋ฅธ์ชฝ, ์ผ์ชฝ์ ์ฐพ์์ 1์ธ ๊ทธ๋ฆผ์ ๋ ํ์ ๋ด๊ณ , ๋ค์ ํ์์ ๊บผ๋ด์ ๋๊ฐ์ด ๋ฐ๋ณตํ๋ฉด ๋์ด๋ค.
๋จผ์ ํ์ ์ขํ๋ฅผ ๋ฃ์ด์ฃผ๊ธฐ ์ํด์ Pair๋ผ๋ ํด๋์ค๋ฅผ ์์ฑํ์ฌ ๋ฃ์ด์ฃผ๋๋ก ํ๋ค.
public class Pair {
int x, y;
public Pair(int x, int y){
this.x = x;
this.y = y;
}
public void getX(){
return x;
}
public void getY(){
return y;
}
public int setX(int x){
this.x = x;
}
public int setY(int y){
this.y = y;
}
}
์ด์ ํ๋ฅผ ์ด์ฉํด์ BFS๋ฅผ ๊ตฌํํด๋ณผ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์ผ๋ ์๋ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ๋ฉด์ ๊ตฌํํด๋ณด์.
// ์์๋๋ก, ์ค๋ฅธ์ชฝ, ์๋, ์ผ์ชฝ, ์์ชฝ ์ขํ๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
int[] dx = {1, 0 , -1, 0);
int[] dy = {0, -1, 0, 1};
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if (arr[i][j] == 0 || visit[i][j]) {
continue; // ์์น ์ด ์๋๊ฑฐ๋, ๋ฐฉ๋ฌธํ์ ๋ PASS!
}
visit[i][j] = true; // ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ!
qu.offer(new Pair(i, j)); // ํด๋น ์ขํ๋ฅผ ๋ฃ์ด์ค๋ค.
count++;
area = 0;
while(!qu.isEmpty()) {
Pair p = qu.poll();
area++;
for(int k = 0; k < 4; k++) {
int n_X = p.x + dx[k];
int n_Y = p.y + dy[k];
// ์๋ก ๊ณ์ฐํ ์ขํ๊ฐ 0๋ณด๋ค ์๊ฑฐ๋, ๋ฒฝ์ ๋ถ๋ชํ๋ค๋ฉด PASS!
if(n_X < 0 || n_X >= n || n_Y < 0 || n_Y >= m){
continue;
}
if(arr[n_X][x_Y] == 1 && visit[n_X][n_Y]){
qu.offer(new Pair(n_X, n_Y));
visit[n_X][n_Y] = true;
}
}
}
if (max > area) {
max = area; // ์ต๋์ธ ๊ทธ๋ฆผ์ ์ฐพ๋๋ค.
}
}
}
์ฌ๊ธฐ์ ๊ฐ์ฅ ์ค์ํ ์ ์, ์๋ก์ด ์ขํ๋ฅผ ๊ณ์ฐํ ๋ ๋ฒฝ์ ๋ถ๋ชํ๊ฑฐ๋, ๊ทธ๋ฆผ์ ๊ธธ์ด์ ๋ฒ์ด๋๋ฉด PASSํด์ค์ผ ํ๋ค!
๊ทธ๋ฆฌ๊ตฌ ๋ง์ง๋ง์๋ ๊ทธ๋ฆผ์ ๋์ด๊ฐ ์ต๋์ธ ๊ฒ์ ์ฐพ์์ max ๋ณ์์ ๋ด์์ฃผ๋ฉด ๋๋ค!
๐ ์ ์ฒด ์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
static int n, m;
static int[][] arr;
static boolean[][] visit;
static int[] dx;
static int[] dy;
static Queue<Pair> qu;
public static void main(String args[]) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
arr = new int[n][m];
visit = new boolean[n][m];
qu = new LinkedList<>();
dx = new int[]{1, 0, -1, 0};
dy = new int[]{0, 1, 0, -1};
// ๋ฐฐ์ด๊ฐ ์ธํ
for(int i=0; i<n; i++){
st = new StringTokenizer(bf.readLine());
for(int j=0; j<m; j++){
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
// ์์!
int count = 0;
int area = 0;
int max = 0;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
// 0์ด๊ฑฐ๋ ๋ฐฉ๋ฌธํ์ ์ด ์์ผ๋ฉด ์๋ต.
if(arr[i][j] == 0 || visit[i][j]){
continue;
}
count++; // 1์ด๊ณ , ๋ฐฉ๋ฌธ์ ํ์ง ์์์ผ๋ฏ๋ก ์์์ ์ด ๋๋๊น +1
qu.offer(new Pair(i, j)); // ํ์ ์ขํ๋ฅผ ๋ฃ์ด์ค๋ค.
visit[i][j] = true; // ๋ฐฉ๋ฌธ์ฒ๋ฆฌ!
area = 0; // 0์ด๋ฉด ๊ทธ๋ฆผ์ด ๋๊ฒผ์ผ๋ฏ๋ก area = 0!
while(!qu.isEmpty()){
Pair p = qu.poll();
area++; // ๋์ด +1
for(int k = 0; k < 4; k++){
int n_x = p.x + dx[k];
int n_y = p.y + dy[k];
if(n_x < 0 || n_x >= n || n_y < 0 || n_y >= m){
continue;
}
if(arr[n_x][n_y] == 1 && !visit[n_x][n_y]){
qu.offer(new Pair(n_x, n_y));
visit[n_x][n_y] = true;
}
}
}
if(area > max){
max = area;
}
}
}
System.out.println(count);
System.out.println(max);
}
public static class Pair{
int x;
int 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;
}
}
}