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;
}
}