문제 내용은 입력으로 밭 갯수, 가로, 세로 길이, 배추 갯수, 배추가 들어있는 위치를 받은 뒤 벌레를 몇 개를 넣어주면 되는지 확인하면 되는데, 배추가 동서남북으로 연결되어 있을 경우 벌레는 한 마리로 충분하다. 문제 풀기 전 주의할 점은 문제에 있는 표와, 입력에 들어오는 표가 다르기 때문에, 문제 참고해서 하면 표가 다르기 때문에 헷갈려서 시간을 허비하는 것을 주의하자
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
static boolean[][] visited;
static int[][] map;
static int worms = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int count = Integer.parseInt(br.readLine());
for (int i = 0; i < count; i++) {
int[] colRowCabbage = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt)
.toArray();
visited = new boolean[colRowCabbage[0]][colRowCabbage[1]];
map = new int[colRowCabbage[0]][colRowCabbage[1]];
worms = 0;
for (int j = 0; j < colRowCabbage[2]; j++) {
int[] cabbage = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt)
.toArray();
map[cabbage[0]][cabbage[1]] = 1;
}
for (int j = 0; j < map.length; j++) {
for (int k = 0; k < map[0].length; k++) {
if (!visited[j][k] && map[j][k] == 1) {
bfs(j, k);
}
}
}
System.out.println(worms);
}
}
public static void bfs(int row, int col) {
Queue<int[]> queue = new LinkedList<>();
visited[row][col] = true;
queue.add(new int[]{row, col});
worms += 1;
while (!queue.isEmpty()) {
int[] xy = queue.poll();
int x = xy[0];
int y = xy[1];
int[] dx = {0, 0, 1, -1};
int[] dy = {1, -1, 0, 0};
for (int k = 0; k < 4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if (nx >= 0 && nx < map.length && ny >= 0 && ny < map[0].length) {
if (!visited[nx][ny] && map[nx][ny] == 1) {
queue.add(new int[]{nx, ny});
visited[nx][ny] = true;
}
}
}
}
}
}
문제를 풀어보자면, 먼저 입력을 받아 0,1 로 이루어진 배열을 만든 다음 BFS로 배열을 탐색하면서 한번 들어간 후 동서남북으로 연결되어 있는 배추를 모두 visited 처리해주면, 배추밭 별로 벌레가 한 마리만 들어가기 때문에 벌레의 수를 구해줄 수 있다.
Leave a Reply