https://www.acmicpc.net/problem/1303
1303번: 전쟁 - 전투
첫째 줄에는 전쟁터의 가로 크기 N, 세로 크기 M(1 ≤ N, M ≤ 100)이 주어진다. 그 다음 두 번째 줄에서 M+1번째 줄에는 각각 (X, Y)에 있는 병사들의 옷색이 띄어쓰기 없이 주어진다. 모든 자리에는
www.acmicpc.net
> 풀이(BFS)
/*
* 백준 1303 전쟁-전투
* #실버1
* #BFS
* 23.05.25
*/
public class boj_1303 {
static int N,M;
static int[] dx = {1,0,-1,0};
static int[] dy = {0,1,0,-1};
static char[][] map;
static boolean[][] visited;
static class Point {
int x,y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
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++) {
map[i] = br.readLine().toCharArray();
}
int wPower = 0; int bPower = 0;
for(int i = 0; i < M; i++) {
for(int j = 0; j < N; j++) {
if(!visited[i][j]) {
int cnt = BFS(i,j,map[i][j]);
if(map[i][j] == 'W') {
wPower += cnt;
} else {
bPower += cnt;
}
}
}
}
System.out.println(wPower);
System.out.println(bPower);
}
public static int BFS(int x, int y, char z) {
Queue<Point> q = new LinkedList<>();
visited[x][y] = true;
q.offer(new Point(x,y));
int rtnCnt = 1;
while(!q.isEmpty()) {
Point point = q.poll();
for(int i = 0; i < 4; i++) {
int nx = point.x + dx[i];
int ny = point.y + dy[i];
if(nx >= 0 && nx < N && ny >= 0 && ny < M) {
if(!visited[nx][ny] && map[nx][ny] == z) {
visited[nx][ny] = true;
rtnCnt++;
q.offer(new Point(nx,ny));
}
}
}
}
return rtnCnt * rtnCnt;
}
}
'PS > BOJ' 카테고리의 다른 글
백준 1926 그림 / JAVA (0) | 2023.05.24 |
---|---|
백준 11725 트리의 부모 찾기 / JAVA (0) | 2023.05.23 |
백준 1388 바닥장식 / JAVA (0) | 2023.05.18 |
백준 4963 섬의개수 / JAVA (0) | 2023.05.17 |
백준 6603 로또 / JAVA (0) | 2023.05.16 |
댓글