https://www.acmicpc.net/problem/1743
코드설명
BFS(너비우선탐색)를 활용합니다.
구현 중에 유의해야할점은,
1. 해당 위치가 '#'일떄만 BFS가 작동하게합니다. 처음에는 단순히 visited[i][j]로 처리했는데 그럴경우 '#'이 아닌데도 호출되어 잘못하면 쓰레기칸과 인접한 칸이 호출되어 쓰레기칸으로 포함되어 Count되는 문제가 생깁니다. 그렇게 되면 최대 쓰레기양에 문제가 되겠지요.
for(int i=0;i<N; i++) { for(int j=0;j<M; j++) { if(visited[i][j] == false && matrix[i][j] == '#') { answer = Math.max(answer, BFS(i, j)); } } }
2. BFS에 필요한 데이터들 초기화시 cnt = 1 로 시작해야합니다. 이유는 해당 큐에 이미 데이터를 넣고 시작하기 때문에 다른 칸에서는 해당 칸에 도달하지 못합니다. 그러므로 cnt = 1 로 해야만 1개가 누락되지 않습니다.
static int BFS(int sr, int sc) { Queue<int[]> q = new LinkedList<>(); q.offer(new int[] {sr, sc}); visited[sr][sc] = true; int cnt = 1;
코드
package Main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; 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 boolean[][] visited = new boolean[101][101]; static int[] dx= {-1,1,0,0}; static int[] dy = {0, 0, -1, 1}; static char[][] matrix = new char[101][101]; 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()); K = Integer.parseInt(st.nextToken()); for(int i=0;i<101; i++) { Arrays.fill(matrix[i], '.'); } for(int i=0;i<K; i++) { st = new StringTokenizer(br.readLine()); int r = Integer.parseInt(st.nextToken()) - 1; int c = Integer.parseInt(st.nextToken()) - 1; matrix[r][c] = '#'; } for(int i=0;i<N; i++) { for(int j=0;j<M; j++) { if(visited[i][j] == false && matrix[i][j] == '#') { // System.out.println("i, j"+i+" "+j); answer = Math.max(answer, BFS(i, j)); } } } System.out.println(answer); } static int BFS(int sr, int sc) { Queue<int[]> q = new LinkedList<>(); q.offer(new int[] {sr, sc}); visited[sr][sc] = true; int cnt = 1; while(!q.isEmpty()) { int[] temp = q.poll(); for(int dir = 0; dir < 4; dir++) { int nr = temp[0] + dx[dir]; int nc = temp[1] + dy[dir]; if(nr < 0 || nr >= N || nc < 0 || nc >= M) continue; if(visited[nr][nc] == true) continue; if(matrix[nr][nc] == '.') continue; visited[nr][nc] = true; q.offer(new int[] { nr, nc}); cnt += 1; } } return cnt; } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1946 신입 사원 - 탐욕법(Greedy) + 정렬(Sort) JAVA (0) | 2024.09.27 |
---|---|
[백준] 1926 그림 - BFS(너비우선탐색) JAVA (0) | 2024.09.27 |
[백준] 1697 숨바꼭질 - BFS(너비우선탐색) JAVA (1) | 2024.09.26 |
[백준] 1660 캡틴 이다솜 - 동적계획법(Dynamic Programming, DP) + 이분탐색(Binary Search) + 누적합(PrefixSum) JAVA (0) | 2024.09.25 |
[백준] 1446 지름길 - 동적계획법(DP, Dynamic Programming) + DFS(깊이우선탐색) JAVA (0) | 2024.09.24 |