https://www.acmicpc.net/problem/1303
코드설명
BFS(너비우선탐색) 을 활용합니다.
전형적인 BFS 문제로써, 구현에 어려움은 없습니다.
유의할점은, 모든 N을 구한뒤 제곱값을 구하는것이 아닌 각 그룹마다 제곱값을 구해서 더해야합니다.
if(arr[i][j] == 'W' && visited[i][j] == false) {
temp = BFS(i, j, 'W');
powerW += temp * temp;
}else if(arr[i][j] == 'B' && visited[i][j] == false){
temp = BFS(i, j, 'B');
powerB += temp * temp;
}
코드
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int N, M, S, P, K, A, B, X, L, R;
static int answer = 0;
static char[][] arr = new char[101][101];
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());
for(int i=0;i<M; i++) {
st = new StringTokenizer(br.readLine());
arr[i] = st.nextToken().toCharArray();
}
for(int i=0;i<M; i++) {
for(int j=0;j<N;j++) {
int temp = 0;
if(arr[i][j] == 'W' && visited[i][j] == false) {
temp = BFS(i, j, 'W');
powerW += temp * temp;
}else if(arr[i][j] == 'B' && visited[i][j] == false){
temp = BFS(i, j, 'B');
powerB += temp * temp;
}
}
}
System.out.println(powerW + " " +powerB);
}
static int powerW= 0, powerB = 0;
static boolean[][] visited = new boolean[101][101];
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1};
static int BFS(int r, int c, char type) {
Queue<int[]> q = new LinkedList<int[]>();
q.offer(new int[] {r, c});
visited[r][c] =true;
int cnt = 1;
while(!q.isEmpty()) {
int[] temp = q.poll();
for(int dir = 0; dir < 4; dir++) {
int nr = temp[0] + dx[dir];
int nc = temp[1] + dy[dir];
if(nr < 0 || nr >= M || nc < 0 || nc >= N) continue;
if(visited[nr][nc] == true) continue;
if(arr[nr][nc] != type) continue;
visited[nr][nc] = true;
cnt += 1;
q.offer(new int[] {nr, nc});
}
}
return cnt;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1446 지름길 - 동적계획법(DP, Dynamic Programming) + DFS(깊이우선탐색) JAVA (0) | 2024.09.24 |
---|---|
[백준] 1389 케빈 베이컨의 6단계 법칙 - BFS(넓이우선탐색) JAVA (0) | 2024.09.24 |
[백준] 1141 접두사 - 문자열(String) + 해시셋(HashSet) + 정렬(Sort) + Comparator JAVA (0) | 2024.09.19 |
[백준] 1105 팔 - 아이디어(Idea) + 수학(Math) + 탐욕법(Greedy) JAVA (0) | 2024.09.18 |
[백준] 24481 알고리즘 수업 - 깊이 우선 탐색 3 - DFS(깊이우선탐색) JAVA (0) | 2024.09.18 |