문제
10026번: 적록색약
적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)
www.acmicpc.net
구현 방법
둘다 bfs로 풀어주었고 적록색약이 아닌 사람일때와 적록색약인 사람일때와의 조건만 조금 다르게 해주었습니다.
처음에는 "같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다" 라는 말을 보고 적록색약이라는 말의 뜻을 제대로 생각하지 않고 두 글자를 두 개로 생각해서 적록색약인 사람은 두 가지의 색깔을 한 가지로 인식한다.. 라고 하고 풀었습니다. 당연히 틀렸습니다.
고민하다가 적록색약.. 빨강색이랑 초록색을 구분 못한다..! 를 깨달았고 조건만 다시 바꿔주었습니다^_^..
방문을 하지 않은 곳을 선택하여 해당 값(R, G, B)을 search라는 char 변수에 저장하고 4방탐색을 해주었습니다.
적록색약이 아닌 사람은 탐색 값이 해당 값과 같을 때만 들어가게 해주었습니다.
적록색약인 사람은 R와 G을 구분하지 못하므로 해당 값이 R와 G 일 때는 탐색 값이 R, G 일 때 들어가게 해주었고, 해당 값이 B일 때는 탐색 값이 B일 때만 들어가게 해주었습니다.
구현 코드
package BOJ.Gold;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class B10026_적록색약 {
static int[][] deltas = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
static int N, gP, bP;
static char[][] drawing;
static int[][] check;
static Queue<int[]> bfs;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
N = Integer.parseInt(br.readLine());
drawing = new char[N][N];
check = new int[N][N];
for (int i=0;i<N;i++) {
String input = br.readLine();
drawing[i] = input.toCharArray();
}
loop('g'); // g : 적록색약 아닌 사람
check = new int[N][N]; // 방문체크 초기화
loop('b'); // b : 적록색약인 사람
sb.append(gP+" "+bP);
System.out.println(sb);
}
static void loop(char who) {
bfs = new LinkedList<>();
for (int i=0;i<N;i++) {
for (int j=0;j<N;j++) {
if (check[i][j]==0) { // 방문하지 않았다면
if (who=='b') bP++; // 적록색약인 사람이면 적록색약 카운트 ++
else gP++; // 적록색약이 아닌 사람이면 적록색약 X 카운트++
check[i][j] = 1;
bfsL(i, j, drawing[i][j], who); // bfs -> 해당 값 넘겨줌
}
}
}
}
static void bfsL(int r, int c, char search, char who) {
bfs.offer(new int[] {r, c});
while(!bfs.isEmpty()) {
int[] now = bfs.poll();
for (int d=0;d<4;d++) {
int nr = now[0]+deltas[d][0];
int nc = now[1]+deltas[d][1];
if (isIn(nr, nc) && check[nr][nc]==0) {
if (who=='g' && drawing[nr][nc]==search) { // 적록색약이 아닌 사람이라면 해당 값과 탐색 값이 일치할 때만 추가
check[nr][nc] = 1;
bfs.offer(new int[] {nr, nc});
}
else if (who=='b' && ((drawing[nr][nc]=='R'||drawing[nr][nc]=='G') && (search=='R' ||search=='G') ||
drawing[nr][nc]=='B' && search=='B')) { // 적록색약인 사람이라면 R, G를 구분하지 못하기 때문에 조건 추가
check[nr][nc] = 1;
bfs.offer(new int[] {nr, nc});
}
}
}
}
}
static boolean isIn(int nr, int nc) {
return nr>=0 && nr<N && nc>=0 && nc<N;
}
}
'백준' 카테고리의 다른 글
백준 17086번 : 아기 상어2 (0) | 2021.03.09 |
---|---|
백준 10815번 : 숫자 카드 (0) | 2021.03.07 |
백준 2960번 : 에라토스테네스의 체 (0) | 2021.03.07 |
백준 18310번 : 안테나 (0) | 2021.03.07 |
백준 1764번 : 듣보잡 (0) | 2021.03.07 |