728x90
1303번: 전쟁 - 전투
첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는
www.acmicpc.net
풀이
DFS로 덩어리를 저장해주며 탐색해주었다.
index out이 한번 발생했는데, 가로와 세로를 잘 확인하자 ~!
전체코드
package 백준renew;
import java.io.*;
import java.util.*;
public class 실버1_1303_전쟁전투 {
static int N, M, sum;
static int whiteSoldier = 0;
static int blueSoldier = 0;
static boolean visited[][];
static char map[][];
static int goX[] = {-1, 1, 0, 0};
static int goY[] = {0, 0, -1, 1};
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new char[M][N];
visited = new boolean[M][N];
for(int i=0; i<M; i++) {
String tmp = br.readLine();
map[i] = tmp.toCharArray();
}
for(int i=0; i<M; i++) {
for(int j=0; j<N; j++) {
if(map[i][j]=='W' && !visited[i][j]) {
sum = 1;
Check(i, j, 'W');
whiteSoldier += (sum*sum);
}
if(map[i][j]=='B' && !visited[i][j]) {
sum = 1;
Check(i, j, 'B');
blueSoldier += (sum*sum);
}
}
}
sb.append(whiteSoldier).append(" ").append(blueSoldier);
bw.write(sb.toString());
bw.close();
}
static void Check(int x, int y, char color) {
visited[x][y] = true;
for(int i=0; i<4; i++) {
int newX = x + goX[i];
int newY = y + goY[i];
if(newX < 0 || newX >=M || newY < 0 || newY >=N || visited[newX][newY] || map[newX][newY]!=color) {
continue;
}
sum++;
Check(newX, newY, color);
}
}
}
728x90
'코테 > Algorithm' 카테고리의 다른 글
[Programmers] 잡은 물고기 중 가장 큰 물고기의 길이 구하기 (MySQL) (0) | 2024.05.01 |
---|---|
[BOJ] 1051: 숫자 정사각형 (JAVA) (0) | 2024.04.24 |
[BOJ] 15650: N과 M(2) (JAVA) (0) | 2024.04.21 |
[BOJ] 1431: 시리얼 번호 (JAVA) (0) | 2024.04.21 |
[BOJ] 17390: 이건 꼭 풀어야 해! (JAVA) (1) | 2024.04.19 |