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; } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2468 안전 영역 - BFS(넓이우선탐색) JAVA (0) | 2024.10.01 |
---|---|
[백준] 1946 신입 사원 - 탐욕법(Greedy) + 정렬(Sort) JAVA (0) | 2024.09.27 |
[백준] 1743 음식물 피하기 - BFS(너비우선탐색) JAVA (0) | 2024.09.26 |
[백준] 1697 숨바꼭질 - BFS(너비우선탐색) JAVA (1) | 2024.09.26 |
[백준] 1660 캡틴 이다솜 - 동적계획법(Dynamic Programming, DP) + 이분탐색(Binary Search) + 누적합(PrefixSum) JAVA (0) | 2024.09.25 |