1303번: 전쟁 - 전투
첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는
www.acmicpc.net
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, M, count, white, blue; // 아군 위력의 합, 적군 위력의 합
static char A[][], color;
static boolean[][] visited;
static int[] dr = {-1, 0, 1, 0}; // 상, 우, 하, 좌
static int[] dc = {0, 1, 0, -1}; // 상, 우, 하, 좌
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // 전쟁터 가로크기(열)
M = Integer.parseInt(st.nextToken()); // 전쟁터 세로크기(행)
A = new char[M][N];
visited = new boolean[M][N];
for (int i = 0; i < M; i++) {
A[i] = br.readLine().toCharArray();
}
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (visited[i][j]) continue;
count = 0;
color = A[i][j];
dfs(i, j);
if (A[i][j] == 'W') white += count * count;
else blue += count * count;
}
}
System.out.println(white + " " + blue);
}
static void dfs(int r, int c) {
count++;
visited[r][c] = true;
for (int d = 0; d < 4; d++) {
int nr = r + dr[d];
int nc = c + dc[d];
if (nr < 0 || nr >= M || nc < 0 || nc >= N || visited[nr][nc] || A[nr][nc] != color) {
continue;
}
dfs(nr, nc);
}
}
}
728x90
'알고리즘 > DFS' 카테고리의 다른 글
[백준][JAVA] 10451번 순열 사이클 (1) | 2024.03.16 |
---|---|
[백준][JAVA] 2250번 트리의 높이와 너비 (0) | 2024.03.03 |
[백준][JAVA] 2251번 물통 (0) | 2024.02.08 |
[백준][JAVA] 3184번 양 (2) | 2024.01.29 |
[백준][JAVA] 2210번 숫자판 점프 (0) | 2024.01.04 |