https://www.acmicpc.net/problem/1926

코드설명

 BFS(너비우선탐색)를 활용합니다.

 

각 그림을 만날떄마다 BFS를 실행하고, BFS내에서 그림을 마주했다면 해당 위치를 0 으로 바꾸어서 이후에 이미 방문한 그림공간은 다시 방문하지 않도록 합니다.

코드

package Main;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class Main {
	static int N, M, S, P, A, B, X, L, R, C, n, k, m, l, K, D;
	static int answer = 0;
	static int[][] matrix = new int[501][501];
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		for(int i=0;i<N; i++) {
			st = new StringTokenizer(br.readLine());
			for(int j=0; j<M; j++) {
				matrix[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		int pictureCnt = 0;
		for(int i=0;i<N; i++) {
			for(int j=0; j<M; j++) {
				if(matrix[i][j] == 1) {
					pictureCnt += 1;
					answer = Math.max(answer, BFS(i, j));
				}
			}
		}
		System.out.println(pictureCnt);
		System.out.println(answer);
	}
	static int BFS(int sr, int sc) {
		Queue<int[]> q = new LinkedList<>();
		int retCnt = 0;
		q.offer(new int[] {sr, sc});
		matrix[sr][sc] = 0;
		while(!q.isEmpty()) {
			int[] temp = q.poll();
			
			retCnt += 1;
			for(int[] dir : new int[][] { {0, 1}, {0, -1}, {-1, 0}, {1, 0} }) {
				int nr = temp[0] + dir[0];
				int nc = temp[1] + dir[1];
				
				if(nr < 0 || nr >= N || nc < 0 || nc >= M) continue;
				if(matrix[nr][nc] == 0) continue;
				matrix[nr][nc] = 0;
				q.offer(new int[] {nr, nc});
			}
		}
		return retCnt;
		
	}

}

+ Recent posts