728x90
https://www.acmicpc.net/problem/10026
풀이 방법
1. 2차원 배열을 한칸씩 돌면서, DFS로 구역 개수를 구함 -> 여기서 구한 개수는 적록색약 아닌 사람이 보는 구역
2. 적록색약은 빨강과 초록을 같은 색으로 본다고 했으므로 원래 2차원 배열에서 빨강인 부분을 초록으로 만들어주고,
다시 DFS 로 구역 개수를 구함-> 적록색약인 사람이 보는 구역
JAVA 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_10026_적록색약 {
static StringTokenizer st;
static boolean[][] visited;
static char[][] map;
static int[][] dir= {{0,1},{0,-1},{1,0},{-1,0}};
static int N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N= Integer.parseInt(br.readLine());
map=new char[N][N];
for (int i = 0; i < N; i++) {
String str=br.readLine();
for (int j = 0; j < N; j++) {
map[i][j]=str.charAt(j);
}
}
visited=new boolean[N][N];
int sum=0; // 적록색약 x
for (int i=0; i<N; i++) {
for (int j = 0; j <N; j++) {
char value=map[i][j];
if(dfs(i,j,value)) {
sum++;
}
}
}
// R==G이기 때문에 R->G로 바꿔줌
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j]=='R') map[i][j]='G';
}
}
int redblue=0; // 적록색약
visited=new boolean[N][N];
for (int i=0; i<N; i++) {
for (int j = 0; j <N; j++) {
char value=map[i][j];
if(dfs(i,j,value)) {
redblue++;
}
}
}
System.out.println(sum+" "+redblue);
}
private static boolean dfs(int x, int y, char value) {
if(!visited[x][y]) {
visited[x][y]=true;
for(int i=0; i<4; i++) {
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(isOkay(nx,ny)&&map[nx][ny]==value&&!visited[nx][ny]) {
dfs(nx,ny,value);
}
}
return true;
}else {
return false;
}
}
private static boolean isOkay(int x, int y) {
return x>=0 && y>=0 && x<N && y<N;
}
}
조금 더 효율적으로 풀수는 없을지 고민해봐야겠다.
728x90
'알고리즘 > 백준 BOJ' 카테고리의 다른 글
[JAVA] 백준 13300 방배정 (0) | 2021.08.28 |
---|---|
[JAVA] 백준 16236 아기상어 (0) | 2021.08.25 |
[JAVA] 백준 1260 DFS와 BFS (0) | 2021.08.23 |
[JAVA] 백준 1074 Z 풀이 (0) | 2021.08.22 |
[JAVA] 백준 1987 알파벳 풀이 (0) | 2021.08.20 |