반응형
https://www.acmicpc.net/problem/10026
적록색약이 봤을 때와 아닌 사람이 봤을 때 각각 이렇게 보인다.
적록색약이 아닐 때 너비우선 탐색을 우선 해주고, 완료한 다음 입력받은 배열의 G값을 R값으로 바꾸어 주고 너비우선 탐색을 진행하면 된다.
import java.io.*;
import java.util.*;
public class Main {
static int num;
static String[][] arr;
static boolean[][] visit;
static int[] dx = { 0, 0, 1, -1 };
static int[] dy = { 1, -1, 0, 0 };
static class point {
int x, y;
point(int x, int y) {
this.x = x;
this.y = y;
}
}// class point
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
num = Integer.parseInt(br.readLine()); // N*N그리드
arr = new String[num][num];
int cnta = 0, cntb = 0;
for (int i = 0; i < num; i++) {
arr[i] = br.readLine().split("");
}
visit = new boolean[num][num];
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
if (!visit[i][j]) {
bfs(i, j);
cnta++;
}
}
}
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
if(arr[i][j].equals("G"))
arr[i][j]="R";
}
}
visit = new boolean[num][num];
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
if (!visit[i][j]) {
bfs(i, j);
cntb++;
}
}
}
System.out.println(cnta+" "+cntb);
}// main()
static void bfs(int x, int y) {
Queue<point> qu = new LinkedList<>();
visit[x][y] = true;
qu.add(new point(x, y));
while (!qu.isEmpty()) {
point tmp = qu.poll();
int tx = tmp.x;
int ty = tmp.y;
for (int i = 0; i < 4; i++) {
int nx = tx + dx[i];
int ny = ty + dy[i];
if (nx >= 0 && ny >= 0 && nx < num && ny < num) {
if (!visit[nx][ny] && arr[nx][ny].equals(arr[tx][ty])) {
qu.add(new point(nx, ny));
visit[nx][ny] = true;
}
}
}
}
}// bfs()
}// class Main
728x90
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
[JAVA] 백준 9251 : LCS (0) | 2023.02.27 |
---|---|
[Java] 백준 7569 : 토마토 (0) | 2023.02.27 |
[Java] 백준 1011 : Fly to the Alpha Centauri (0) | 2023.02.23 |
[Java] 백준 12865 : 평범한 배낭 (0) | 2023.02.22 |
[Java] 백준 2447 : 별 찍기 -10 (0) | 2023.02.22 |
댓글