백준 1012 유기농 배추 - JAVA

2025. 2. 5. 13:34·알고리즘/백준

1012 문제 링크


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

 

문제 설명


 

입출력


 

코드


< DFS >

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import java.io.*;
import java.util.*;
 
public class Main {
    static int[][] graph;
    static boolean[][] visit;
    static int[] dx = {0, 0, -1, 1};
    static int[] dy = {1, -1, 0, 0};
    static int M;
    static int N;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int T = Integer.parseInt(br.readLine());
        StringTokenizer st;
        for (int i = 0; i < T; i++) {
            st = new StringTokenizer(br.readLine());
            M = Integer.parseInt(st.nextToken());
            N = Integer.parseInt(st.nextToken());
            int K = Integer.parseInt(st.nextToken());
            
            graph = new int[M][N];
            visit = new boolean[M][N];
            
            for (int j = 0; j < K; j++) {
                st = new StringTokenizer(br.readLine());
                int X = Integer.parseInt(st.nextToken());
                int Y = Integer.parseInt(st.nextToken());
                graph[X][Y] = 1;
            }
            
            int result = 0;
            for (int j = 0; j < M; j++) {
                for (int k = 0; k < N; k++) {
                    if (graph[j][k] == 1 && !visit[j][k]) {
                        dfs(j, k);
                        result++;
                    }
                } 
            }
            bw.write(String.valueOf(result) + "\n");
        } 
        bw.flush();
    }
    
    private static void dfs(int X, int Y) {
        visit[X][Y] = true;
        
        for (int i = 0; i < 4; i++) {
            int nx = X + dx[i];
            int ny = Y + dy[i];
            if(nx >= 0 && ny >= 0 && nx < M && ny < N) {
                if (graph[nx][ny] == 1 && !visit[nx][ny]) {
                    dfs(nx, ny);    
                }
            }
        }
    }
}
Colored by Color Scripter
cs

 

< BFS >

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import java.io.*;
import java.util.*;
 
public class Main {
    static int[][] graph;
    static boolean[][] visit;
    static int[] dx = {0, 0, -1, 1};
    static int[] dy = {1, -1, 0, 0};
    static int M;
    static int N;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int T = Integer.parseInt(br.readLine());
        StringTokenizer st;
        for (int i = 0; i < T; i++) {
            st = new StringTokenizer(br.readLine());
            M = Integer.parseInt(st.nextToken());
            N = Integer.parseInt(st.nextToken());
            int K = Integer.parseInt(st.nextToken());
            
            graph = new int[M][N];
            visit = new boolean[M][N];
            
            for (int j = 0; j < K; j++) {
                st = new StringTokenizer(br.readLine());
                int X = Integer.parseInt(st.nextToken());
                int Y = Integer.parseInt(st.nextToken());
                graph[X][Y] = 1;
            }
            
            int result = 0;
            for (int j = 0; j < M; j++) {
                for (int k = 0; k < N; k++) {
                    if (graph[j][k] == 1 && !visit[j][k]) {
                        bfs(j, k);
                        result++;
                    }
                } 
            }
            bw.write(String.valueOf(result) + "\n");
        } 
        bw.flush();
    }
    
    private static void bfs(int X, int Y) {
        visit[X][Y] = true;
        Queue<int[]> queue = new LinkedList<>();
        queue.offer(new int[] {X, Y});
        while(!queue.isEmpty()) {
            int[] current = queue.poll();
            for (int i = 0; i < 4; i++) {
                int nx = current[0] + dx[i];
                int ny = current[1] + dy[i];
                if(nx >= 0 && ny >= 0 && nx < M && ny < N) {
                    if (graph[nx][ny] == 1 && !visit[nx][ny]) {
                        queue.offer(new int[] {nx, ny});
                        visit[nx][ny] = true;
                    }
                }
            }
        }
    }
}
Colored by Color Scripter
cs

 

 

알고리즘 설명


기존 dfs, bfs 문제들과 유사한 문제입니다. 배추는 1칸만 심어져있더라도 지렁이가 있기 때문에, graph[0][0] 부터 시작해서 graph[N][M] 까지 2중 반복문으로 배추가 있고, 방문하지 않은 곳(visit[X][Y] = false)을 발견하면 dfs / bfs로 해당 배추와 연결된 모든 배추를 방문처리합니다. 이후 배추의 군집 개수(result)를 1 증가시킵니다. 누적된 result의 값이 해당 밭의 필요한 지렁이의 개수입니다.
 
연결된 배추의 방문처리는 문제에도 나와있듯이 상하좌우에 위치한 배추가 서로 인접한 것이라고 했으므로, dx[]와 dy[]로 X, Y의 상하좌우의 움직임을 주어 인접한 배추를 찾게 합니다.

 

코드 해석


 입력으로 T(테스트 케이스 수)를 받아, 각 테스트 케이스마다 배추밭 크기(M x N)와 배추의 위치(K개)를 입력받습니다.
이후, 배추의 위치를 2차원 배열 graph[][]에 저장합니다. graph[0][0] 부터 graph[M-1][N-1]까지 이중 반복문으로 배추가 있는 위치(1)이면서 방문하비 않은 곳을 발견하면 DFS 또는 BFS 탐색을 수행합니다. 탐색이 시작될 때마다 result 변수를 1 증가시켜, 지렁이가 필요한 배추 군집의 개수를 계산합니다. 모든 탐색이 끝나면 result를 출력합니다.

'알고리즘 > 백준' 카테고리의 다른 글

백준 1927 최소 힙 - JAVA  (1) 2025.02.13
백준 1697 숨바꼭질 - JAVA  (1) 2025.02.06
백준 1920 수 찾기 - JAVA  (1) 2025.02.04
백준 2667 단지번호붙이기 - JAVA  (1) 2025.02.03
백준 10844 쉬운 계단 수 - JAVA  (0) 2025.02.02
'알고리즘/백준' 카테고리의 다른 글
  • 백준 1927 최소 힙 - JAVA
  • 백준 1697 숨바꼭질 - JAVA
  • 백준 1920 수 찾기 - JAVA
  • 백준 2667 단지번호붙이기 - JAVA
BIS's tech Blog
BIS's tech Blog
Welcome to Kanghyun's tech blog :)
  • BIS's tech Blog
    벼익숙의 기술 블로그
    BIS's tech Blog
  • 전체
    오늘
    어제
    • 분류 전체보기 (68)
      • 알고리즘 (54)
        • 백준 (45)
        • 프로그래머스 (9)
      • CS 스터디 (14)
        • CS - JAVA (11)
        • CS - DB (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    브루트포스
    백준
    자료구조
    재귀
    백트래킹
    Top-Down
    Lv2
    알고리즘 고득점 kit
    BFS
    기술질문
    너비 우선 탐색
    프로그래머스
    CS
    java
    DFS
    완전탐색
    동적 계획
    깊이 우선 탐색
    Baekjoon
    dp
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BIS's tech Blog
백준 1012 유기농 배추 - JAVA
상단으로

티스토리툴바