본문 바로가기
코딩 테스트

1012번 유기농 배추 문제(자바, java) - 백준 문제풀이

by 주용사 2023. 1. 11.
728x90
import java.io.*;
import java.util.*;
import java.math.*;
public class Main {
    static int count = 0;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        for(int ii = 0 ; ii < n ; ii++)
        {
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            int[][] map = new int[x][y];
            boolean[][] visited = new boolean[x][y];
            int k = Integer.parseInt(st.nextToken());
            for(int jj = 0 ; jj < k ; jj++)
            {
                st = new StringTokenizer(br.readLine());
                map[Integer.parseInt(st.nextToken())][Integer.parseInt(st.nextToken())] = 1;
            }
            int answer = 0;
            for(int xx = 0 ; xx < x ; xx++)
                for(int yy = 0 ; yy < y ; yy++)
                    answer += dfs(map, visited, x, y, xx, yy, answer);
            System.out.println(answer);
        }
        br.close();
    }
    public static int dfs(int[][] map, boolean[][] visited, int X, int Y, int xx, int yy, int answer) {
        if (visited[xx][yy] == false && map[xx][yy] == 1) {
            visited[xx][yy] = true;
/* 처음엔 up right left down을 if else if로 묶었는데 많은 테스트케이스를 통과해도 틀렸다고 나왔었다. 그래서 따로 분리했더니 정답 */
            if (up(map, visited, X, Y, xx, yy) == true) {
                // visited[xx-1][yy] = true;
                dfs(map, visited, X, Y, xx - 1, yy, answer);
            }
            if (right(map, visited, X, Y, xx, yy) == true) {
                // visited[xx][yy+1] = true;
                dfs(map, visited, X, Y, xx, yy + 1, answer);
            }
            if (down(map, visited, X, Y, xx, yy) == true) {
                // visited[xx+1][yy] = true;
                dfs(map, visited, X, Y, xx + 1, yy, answer);
            }
            if (left(map, visited, X, Y, xx, yy) == true) {
                // visited[xx][yy-1] = true;
                dfs(map, visited, X, Y, xx, yy - 1, answer);
            }
            if (up(map, visited, X, Y, xx, yy) == false && right(map, visited, X, Y, xx, yy) == false
                    && left(map, visited, X, Y, xx, yy) == false && down(map, visited, X, Y, xx, yy) == false)
                return 1;
            else
                return 0;
        }
        else
            return 0;
    }
    public static boolean up(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
    {
        if(x-1 >= 0 && map[x -1][y] == 1 && visited[x-1][y] == false)
            return true;
        else
            return false;
    }
    public static boolean right(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
    {
        if(y+1 < Y && map[x][y+1] == 1 && visited[x][y+1] == false)
            return true;
        else
            return false;
    }
    public static boolean down(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
    {
        if(x+1 < X && map[x+1][y] == 1 && visited[x+1][y] == false)
            return true;
        else
            return false;
    }
    public static boolean left(int[][] map, boolean[][] visited, int X, int Y, int x, int y)
    {
        if(y-1 >= 0 && map[x][y-1] == 1 && visited[x][y-1] == false)
            return true;
        else
            return false;
    }
}
728x90