ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • boj)1012 - 유기농 배추
    PS/boj 2020. 9. 3. 17:00
    import java.io.*;
    import java.util.StringTokenizer;
    
    public class Main {
    
        static int t, m, n, k, x, y, ans;
        static int[][] graph = new int[50][50];
    
        public static boolean dfs(int x, int y) {
            if (x < 0 || x >= m || y < 0 || y >= n) {
                return false;
            }
    
            if (graph[x][y] == 1) {
                graph[x][y] = 0;
    
                dfs(x - 1, y);
                dfs(x + 1, y);
                dfs(x, y - 1);
                dfs(x, y + 1);
    
                return true;
            }
            return false;
        }
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
            t = Integer.parseInt(br.readLine());
    
            // 테스트 케이스 갯수만큼 반복
            for (int i = 0; i < t; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                m = Integer.parseInt(st.nextToken());
                n = Integer.parseInt(st.nextToken());
                k = Integer.parseInt(st.nextToken());
    
                // 배추가 심어진 곳 표시
                for (int j = 0; j < k; j++) {
                    st = new StringTokenizer(br.readLine());
    
                    x = Integer.parseInt(st.nextToken());
                    y = Integer.parseInt(st.nextToken());
    
                    graph[x][y] = 1;
                }
    
                for (int j = 0; j < m; j++) {
                    for (int l = 0; l < n; l++) {
                        if (dfs(j, l)) {
                            ans++;
                        }
                    }
                }
    
                bw.append(ans + "\n");
                ans = 0;
            }
    
            br.close();
            bw.flush();
            bw.close();
        }
    }
    

     

    - 비슷한 유형의 풀이법이 외워져서 풀긴 했지만 처음으로 제대로 풀었다 ... 만족
    - 조금 변형되서 다른 유형으로 나와도 풀 수 있을까 ?

     

     

    1. 이전에 봤던 덩어리 묶어서 카운팅하는 유형과 비슷하다고 생각되어 dfs로 접근

    2. 입력받은 graph 처음부터 끝까지 dfs를 수행한다.

    2-1) 지렁이는 상하좌우로 움직일수 있으니 상하좌우로 움직이고 만약 범위가 벗어나면 false

    2-2) 그래프를 순회하다가 1을 만나면 값을 0으로 바꿔줘서 중복이 안되게 하고 상하좌우에서 다시 dfs 호출

    2-3) 이렇게 하면 한번 1을 만나면 거기서 상하좌우로 뻗어나갈 수 있는만큼 덩어리로 만들어주고 True return

    3. return 되는 true수 만큼 ans++ 후에 출력 

     

     

     


    www.acmicpc.net/problem/1012

     

     

     

    'PS > boj' 카테고리의 다른 글

    boj)7576 - 토마토  (0) 2020.09.05
    boj)2178 - 미로 탐색  (0) 2020.09.03
    boj)2667 - 단지번호붙이기  (0) 2020.09.03
    boj)2606 - 바이러스  (0) 2020.09.03
    boj)1260 - DFS와 BFS  (0) 2020.09.03
킹수빈닷컴