안녕하세요. 오늘은 백준 음식물 피하기 문제를 풀어보려고 합니다.
https://www.acmicpc.net/problem/1743
주어진 배열에서, 한 곳에 모여있는 최대 음식물 쓰레기의 수를 구하는 문제입니다. BFS/DFS를 사용해야겠다는 생각이 들었습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class bj_음식물_피하기 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine(), " ");
//세로 = N, 가로 = M, 음쓰 수 = K
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
trash = new boolean[N][M];
visited = new boolean[N][M];
answer = 1;
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine(), " ");
int trashN = Integer.parseInt(st.nextToken());
int trashM = Integer.parseInt(st.nextToken());
trash[trashN - 1][trashM - 1] = true;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (visited[i][j] == false && trash[i][j]) {
bfs(i, j, N, M);
}
}
}
System.out.println(answer);
}
static boolean[][] trash;
static boolean[][] visited;
static int answer;
static void bfs(int i, int j, int N, int M) {
int count = 1;
int[] dr = {0, 0, 1, -1};
int[] dc = {1, -1, 0, 0};
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[]{i, j});
visited[i][j] = true;
while (!queue.isEmpty()) {
int[] cur = queue.poll();
for (int d = 0; d < 4; d++) {
int nr = cur[0] + dr[d];
int nc = cur[1] + dc[d];
if (nr > -1 && nc > -1 && nr < N && nc < M && visited[nr][nc] == false && trash[nr][nc]) {
visited[nr][nc] = true;
count++;
queue.offer(new int[]{nr, nc});
}
}
}
if(answer < count) answer = count;
}
}
bfs풀이법은 매번 거의 비슷하기 때문에 확실하게 이해하고 외워둬야겠구나 생각했습니다. 아직 bfs 풀이에 대한 이해가 부족해서 디버깅을 하면서 더 공부해야겠다고 느꼈습니다.