import java.io.*;
import java.util.*;
class Main {
public static int N;
public static int M;
public static int[] dx = {0, 0, -1, 1};
public static int[] dy = {1, -1, 0, 0};
public static String[][] map;
public static boolean[][] visited;
public static int team = 0;
public static int enemy = 0;
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// N, M
String[] temp = br.readLine().split(" ");
N = Integer.parseInt(temp[1]);
M = Integer.parseInt(temp[0]);
// 병사들을 배치할 지도
map = new String[N][M];
visited = new boolean[N][M];
// 지도 데이터 입력
for (int i = 0; i < N; i++) {
temp = br.readLine().split("");
for (int j = 0; j < temp.length; j++) {
map[i][j] = temp[j];
}
}
// BFS 메소드 호출(해당 위치의 병사에 따라서..)
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (!visited[i][j]) {
if (map[i][j].equals("W")) {
int result = BFS(i, j, "W");
team += result * result;
} else {
int result = BFS(i, j, "B");
enemy += result * result;
}
}
}
}
// 결과 값 출력
System.out.println(team + " " + enemy);
}
public static int BFS(int x, int y, String type) {
// Node타입을 갖는 큐 선언
Queue < Node > queue = new LinkedList < > ();
int count = 1;
// 큐에 시작 위치를 넣고 방문처리를 한다.
queue.add(new Node(x, y));
visited[x][y] = true;
while (!queue.isEmpty()) {
// 큐의 가장 앞에 있는 병사를 꺼낸다.
Node node = queue.poll();
// 이동할 수 있는 방향은 총 4가지(상, 하, 좌, 우)
for (int i = 0; i < 4; i++) {
int nx = node.x + dx[i];
int ny = node.y + dy[i];
if (isRange(nx, ny)) {
// 방문하지 않았고, 현재 위치가 입력받은 타입과 동일하다면
if (!visited[nx][ny] && type.equals(map[nx][ny])) {
queue.add(new Node(nx, ny));
visited[nx][ny] = true;
count++; // 개수 1 증가
}
}
}
}
return count;
}
public static boolean isRange(int x, int y) {
if (x >= 0 && y >= 0 && x < N && y < M) {
return true;
}
return false;
}
}
class Node {
// x축, y축
int x, y;
// Node 생성자
public Node(int x, int y) {
this.x = x;
this.y = y;
}
}
해결방법
코드를 보며 설명^_^