1012 유기농 배추
https://www.acmicpc.net/problem/1012
문제설명
배추밭에서 배추 흰지렁이의 수를 계산하는 문제이다.
배추밭은 2차원 배열로 표현되며, 각 테스트 케이스에서 배추밭의 가로 길이(M), 세로 길이(N), 배추가 심어진 위치의 개수(K)가 주어진다. 각 배추의 위치는 (x, y)로 주어지며, 흰지렁이는 연결된 배추들로 이루어진 구역을 처리한다.
이를 BFS(너비 우선 탐색)를 이용하여 해결한다.
접근방식
O(T * M * N) 시간복잡도
BFS를 실행할 때, 한 번의 BFS는 연결된 배추 구역의 모든 셀을 방문한다.
모든 셀을 한 번만 방문하므로, BFS의 시간 복잡도는 O(M * N)이다. 여기서 M과 N은 배추밭의 크기이다.
BFS는 모든 셀을 탐색하므로, BFS 탐색을 전체 배추밭에서 반복하는 것과 같다. 모든 셀의 방문은 한번만 이루어진다.
테스트 케이스를 T개 처리하는 경우
각 테스트 케이스에서 BFS를 호출하므로 총 시간 복잡도는 각 테스트 케이스에 대해 O(M * N)이다.
문제 조건 분석 과정
- 입력 :
- 입력은 여러 테스트 케이스로 구성되어 있다.
- 각 테스트 케이스에서 배추밭의 크기(MxN)와 배추의 위치가 주어진다.
- 각 배추는 연결된 배추들이 같은 구역을 이루므로, 연결된 배추들을 찾기 위해 BFS를 사용한다.
- BFS :
- BFS를 사용하여 배추가 있는 위치에서 시작하여 상하좌우로 이동하면서 연결된 배추들을 모두 방문한다.
- 방문한 배추는 0으로 변경하여 중복 방문을 방지한다.
- 구현 :
- 배추가 있는 모든 위치에서 BFS를 실행하여 모든 연결된 배추들을 탐색한다.
- BFS가 완료될 때마다 배추 흰지렁이의 수를 증가한다.
전체코드
import java.util.*;
import java.io.*;
public class Main {
private static final int[] dx = {-1, 1, 0, 0}; //위, 아래
private static final int[] dy = {0, 0, -1, 1}; //왼, 오
private static void bfs(int[][] field, int x, int y, int M, int N) {
Queue<int[]> queue = new LinkedList<>(); //BFS를 처리할 큐
queue.add(new int[]{x, y}); //시작점을 큐에 추가
field[x][y] = 0;
//큐가 빌때까지 반복
while (!queue.isEmpty()) {
int[] pos = queue.poll(); //큐에서 현재 위치를 꺼냄
int cx = pos[0]; //X좌표
int cy = pos[1]; //Y좌표
//상하좌우 방향으로 이동
for (int i = 0; i < 4; i++) {
int nx = cx + dx[i]; //새 x좌표
int ny = cy + dy[i]; //새 Y좌표
//새로운 위치가 배추밭의 범위 내에 있고 배추가 있는 경우
if (nx >= 0 && nx < M && ny >= 0 && ny < N && field[nx][ny] == 1) {
field[nx][ny] = 0; //새로운 위치의 배추를 방문한 것으로 표시
queue.add(new int[]{nx, ny}); //큐에 새로운 위치 추가
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
//테스트 케이스 처리
for (int t = 0; t < T; t++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken()); //배추밭의 가로 길이
int N = Integer.parseInt(st.nextToken()); //배추밭의 세로 길이
int K = Integer.parseInt(st.nextToken()); //배추가 심어진 위치의 개수
int[][] field = new int[M][N]; //배추밭 = 이차원 배열
//배추가 심어진 위치
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken()); //배추의 x좌표
int y = Integer.parseInt(st.nextToken()); //배추의 y좌표
field[x][y] = 1;
}
int numWorms = 0;
//배추밭을 순회하며 배추가 있는 위치에 BFS 실행
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (field[i][j] == 1) { //배추가 있는 경우
bfs(field, i, j, M, N); //연결된 모든 배추 탐색
numWorms++; //새로운 구역 발견시 배추흰지렁이 수 증가
}
}
}
sb.append(numWorms).append("\n");
}
System.out.print(sb.toString());
}
}
'자료구조 > 문제풀이' 카테고리의 다른 글
[백준 JAVA]11725 트리의 부모찾기 (0) | 2024.08.14 |
---|---|
[백준 JAVA] 14675 단절점과 단절선 (0) | 2024.08.14 |
[백준 JAVA] 1260 DFS와 BFS (0) | 2024.08.13 |
[백준 JAVA] 7576 토마토 (0) | 2024.08.13 |
[백준 JAVA] 2606 바이러스 (0) | 2024.08.12 |