th42500의 TIL

[Java] BOJ1012 - 유기농 배추 본문

Algorithm/BOJ

[Java] BOJ1012 - 유기농 배추

th42500 2021. 12. 24. 00:03

https://www.acmicpc.net/problem/1012

 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 

www.acmicpc.net

 

 

코드 효율
👉 메모리 : 15760 KB
👉 시간 : 164 ms
👉 코드 길이 (주석 및 print()함수 제외) : 1430 B

 

 

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main { // 유기농 배추

    static int M, N, K;
    static int[][] map;
    static boolean[][] v;

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        for (int tc = 0; tc < T; tc++) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            M = Integer.parseInt(st.nextToken()); // 가로
            N = Integer.parseInt(st.nextToken()); // 세로
            K = Integer.parseInt(st.nextToken()); // 배추가 심어져 있는 위치의 개수(노드 정보)
            int cnt = 0; // 지렁이 수

            map = new int[N][M];
            v = new boolean[N][M];
            for (int i = 0; i < K; i++) {
                st = new StringTokenizer(br.readLine());
                int x = Integer.parseInt(st.nextToken());
                int y = Integer.parseInt(st.nextToken());
                map[y][x] = 1;
            }

            // 입력확인
            // print(map);

            // 배추 무더기 찾기
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    if (v[i][j] == false && map[i][j] == 1) {
                        cnt++;
                        dfs(i, j);
                    }
                }
            }
            System.out.println(cnt);
        }

    }

    static int[] dr = { -1, 1, 0, 0 }; // 상하좌우
    static int[] dc = { 0, 0, -1, 1 };

    private static void dfs(int x, int y) {
        v[x][y] = true; // 방문처리

        for (int idx = 0; idx < 4; idx++) {
            int nr = x + dr[idx];
            int nc = y + dc[idx];
            if (0 <= nr && nr < N && 0 <= nc && nc < M && !v[nr][nc] && map[nr][nc] == 1) {
                dfs(nr, nc);
            }
        }
    }

    private static void print(int[][] map) {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println();
    }

}

 

 

💡 포인트

1️⃣ 배추가 인접해있는 배추 무더기의 시작 포인트 찾기 (배추 무더기 수 = 필요한 배추흰지렁이 수)
     👉 배추 무더기 방문처리 전 배추흰지렁이 수에 대한 변수 cnt++

2️⃣ 시작 포인트를 찾은 배추 무더기 방문처리 하기 (사방탐색 & dfs)
     👉 DFS가 아닌 BFS로도 풀 수 있을 것 같다

'Algorithm > BOJ' 카테고리의 다른 글

[Java] BOJ3986 - 좋은 단어  (0) 2022.03.12
[Java] BOJ2504 - 괄호의 값  (0) 2022.03.10
[Java] BOJ2606 - 바이러스  (0) 2021.12.22
[Java] BOJ1931 - 회의실 배정  (0) 2021.12.20
[Java] BOJ10451 - 순열 사이클  (0) 2021.12.17
Comments