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());
    }
}

+ Recent posts