반응형
https://www.acmicpc.net/problem/10026
풀이
일반적인 bfs 문제
bfs 함수 부분을 한번만 쓰려고 적록색약 아닐때 version=true, 적록색약 일때 version=false로
나눠주고 적록색약인 경우
R과 G를 같은걸로 보니까 R일경우 G를 봐도 큐에 넣어주고
G일경우 R을 봐도 큐에 넣어주고,
check 값을 true로 바꿔줬습니다.
import java.io.*;
import java.util.*;
class xy{
int x;
int y;
public xy(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
//bfs문 하나만 쓰려고했는데 더 오래걸림,,
// 메모리 초과 안나니까 나눠서 짜는게 더 효율적
public class Main {
static int n,cnt1,cnt2;
static char[][] graph;
static boolean[][] check,check2;
static Queue<xy> queue=new LinkedList<xy>();
static StringBuilder sb=new StringBuilder();
// 상 우 하 좌
static int[] dx= {-1,0,1,0};
static int[] dy= {0,1,0,-1};
public static void main(String[] args) throws Exception {
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(br.readLine()," ");
n=Integer.parseInt(st.nextToken());
graph=new char[n][n];
for(int i=0;i<n;i++) {
String tmp=br.readLine();
for(int j=0;j<n;j++) {
graph[i][j]=tmp.charAt(j);
}
}
check=new boolean[n][n];
check2=new boolean[n][n];
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
char color=graph[i][j];
if(check[i][j]==false) {
bfs(i,j,color,true);
cnt1+=1;
}
if(check2[i][j]==false) {
bfs(i,j,color,false);
cnt2+=1;
}
}
}
System.out.println(cnt1+" "+cnt2);
}
private static void bfs(int x, int y, char color,boolean version) {
// TODO Auto-generated method stub
if(version==true) {
check[x][y]=true;
}
else {
check2[x][y]=true;
}
queue.offer(new xy(x,y));
while(!queue.isEmpty()) {
int q_x=queue.peek().x;
int q_y=queue.peek().y;
queue.poll();
for(int i=0;i<4;i++) {
int nx=q_x+dx[i];
int ny=q_y+dy[i];
if(0<=nx && nx<n && 0<=ny && ny<n ) {
if(version==true && graph[nx][ny]==color&& check[nx][ny]==false) {
queue.offer(new xy(nx,ny));
check[nx][ny]=true;
}else if(version==false && graph[nx][ny]==color&& check2[nx][ny]==false) {
queue.offer(new xy(nx,ny));
check2[nx][ny]=true;
}
else if(version==false&&color=='R' &&graph[nx][ny]=='G'&& check2[nx][ny]==false){
queue.offer(new xy(nx,ny));
check2[nx][ny]=true;
}else if(version==false&&color=='G' &&graph[nx][ny]=='R'&& check2[nx][ny]==false){
queue.offer(new xy(nx,ny));
check2[nx][ny]=true;
}
}
}
}
}
}
반응형
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[JAVA/자바 SWEA 3124] 최소 스패닝 트리 (0) | 2021.09.15 |
---|---|
[JAVA/자바 백준 1149] RGB거리 (0) | 2021.09.15 |
[Java SWEA 1247] 최적 경로 (0) | 2021.08.19 |
[JAVA/자바 1992 백준] 쿼드트리 (0) | 2021.08.18 |
[JAVA SWEA 1210 ] Ladder1 (0) | 2021.08.04 |