문제 풀이(65)

Youngseon Kim·2024년 2월 5일

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

import java.util.*;
import java.io.*;


/*
5
....X
..XX.
.....
.XX..
X....
 */

/**
2칸 이상의 빈 칸이 존재하면 그 곳에 몸을 양 옆으로 쭉 뻗으면서 누울 수 있다. 
 */
public class Main {

    static int num;
    static int[][] board;
    static boolean[][] visited;

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
        num = Integer.parseInt(br.readLine());

        board = new int[num][num];

        visited = new boolean[num][num];

        for (int i = 0; i < num; i++) {

            String str = br.readLine();

            for (int j = 0; j < num; j++) {
                
                String s = String.valueOf(str.charAt(j));

                if(s.equals("X")) board[i][j] = 1;
                if (s.equals("."))board[i][j] = 0;
            }
        }

        StringBuilder sb = new StringBuilder();
        
       int ans = 0;
        
        for (int i = 0; i < num; i++) {
            for (int j = 0; j < num; j++) {

                if (visited[i][j] == true || board[i][j] == 1) {
                    continue;
                }
                
                visited[i][j] = true;

                int res = dfs1(i,j);
    

                if (res >= 2) {
                    ans++;
                }

            }
        }

        sb.append(ans+" ");


        visited = new boolean[num][num];

        ans = 0;
        
        for (int i = 0; i < num; i++) {
            for (int j = 0; j < num; j++) {

                if (visited[i][j] == true || board[i][j] == 1) {
                    continue;
                }
                
                visited[i][j] = true;

                int res = dfs2(i,j);
    
        

                if (res >= 2) {
                    ans++;
                }

              

            }
        }

        sb.append(ans);

        System.out.println(sb.toString());

    }

    public static void print()
    {
        for (int i = 0; i < num; i++) {
            System.out.println(Arrays.toString(visited[i]));
        }
    }

    public static int dfs1(int x, int y){

        int cnt = 1;

        int nx = x;

        int ny = y + 1;

        if (0 <= nx && nx < num && 0 <= ny && ny < num && board[nx][ny] == 0 && !visited[nx][ny] ){
            visited[nx][ny] = true;
            cnt += dfs1(nx, ny);
        }

        return cnt;
    }


    public static int dfs2(int x, int y){

        int cnt = 1;

        int nx = x + 1;

        int ny = y;

        if (0 <= nx && nx < num && 0 <= ny && ny < num && board[nx][ny] == 0 && !visited[nx][ny] ){
            visited[nx][ny] = true;
            cnt += dfs2(nx, ny);
        }

        return cnt;
    }
}

0개의 댓글