알고리즘 공부
백준 적록색약(복습)
컴퓨터과학
2023. 10. 26. 22:28
https://www.acmicpc.net/problem/10026
10026번: 적록색약
적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)
www.acmicpc.net
bfs 문제 다시 풀어도 시간이 좀 걸리는문제네요.. 자바로 풀어봤습니다.
import java.io.*;
import java.util.*;
class Data {
private int gi;
private int gj;
public Data() {
}
public Data(int gi, int gj) {
this.gi = gi;
this.gj = gj;
}
public void gi(int gi) {
this.gi = gi;
}
public void gj(int gj) {
this.gj = gj;
}
public int gi() {
return gi;
}
public int gj() {
return gj;
}
}
public class Main {
public static void main(String[] args) throws Exception {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
scan.nextLine();
ArrayList<ArrayList<Character>> maps = new ArrayList<>();
ArrayList<ArrayList<Boolean>> bVisited = new ArrayList<>();
ArrayList<ArrayList<Boolean>> gbbVisited = new ArrayList<>();
for (int i = 0; i < n; i++) {
ArrayList<Character> tmpMap = new ArrayList<>();
ArrayList<Boolean> tmpBv = new ArrayList<>();
ArrayList<Boolean> tmpBvd = new ArrayList<>();
String tmpstr = scan.nextLine();
for (int j = 0; j < tmpstr.length(); j++) {
tmpBv.add(false);
tmpBvd.add(false);
tmpMap.add(tmpstr.charAt(j));
}
gbbVisited.add(tmpBvd);
bVisited.add(tmpBv);
maps.add(tmpMap);
}
int diri[] = { 1, -1, 0, 0 };
int dirj[] = { 0, 0, 1, -1 };
Queue<Data> q = new LinkedList<>();
// 적록인경우
// 정산인
int red = 0;
int green = 0;
int redgreen = 0;
// int green=0;
int blue = 0;
char c[] = { 'R', 'G', 'B' };
int cnt = 0;
for (int k = 0; k < 4; k++) {
for (int t = 0; t < n; t++) {
for (int z = 0; z < n; z++) {
boolean bfind = false;
if (k == 3) {
if (gbbVisited.get(t).get(z) == false) {
// System.out.println(t+":"+z);
if (maps.get(t).get(z) == 'R' || maps.get(t).get(z) == 'G') {
q.add(new Data(t, z));
}
}
// 정상인
while (!q.isEmpty()) {
Data start = q.peek();
q.poll();
if (bfind == false) {
redgreen++;
bfind = true;
}
for (int i = 0; i < 4; i++) {
int tmpDiri = diri[i] + start.gi();
int tmpDirj = dirj[i] + start.gj();
// System.out.println(tmpDiri+","+tmpDirj);
if (tmpDiri == -1 || tmpDirj == -1 || tmpDiri >= n || tmpDirj >= n) {
continue;
}
if (gbbVisited.get(tmpDiri).get(tmpDirj) == false) {
if ((maps.get(tmpDiri).get(tmpDirj) == 'R'
|| maps.get(tmpDiri).get(tmpDirj) == 'G')) {
gbbVisited.get(tmpDiri).set(tmpDirj, true);
q.add(new Data(tmpDiri, tmpDirj));
}
}
}
}
}
if (k != 3) {
if (maps.get(t).get(z) == c[k] && bVisited.get(t).get(z) == false) {
q.add(new Data(t, z));
}
// 정상인
while (!q.isEmpty()) {
Data start = q.peek();
q.poll();
if (bfind == false) {
if (c[k] == 'R') {
red++;
} else if (c[k] == 'G') {
green++;
} else if (c[k] == 'B') {
blue++;
}
bfind = true;
}
for (int i = 0; i < 4; i++) {
int tmpDiri = diri[i] + start.gi();
int tmpDirj = dirj[i] + start.gj();
if (tmpDiri == -1 || tmpDirj == -1 || tmpDiri >= n || tmpDirj >= n) {
continue;
}
if (maps.get(tmpDiri).get(tmpDirj) == c[k]
&& bVisited.get(tmpDiri).get(tmpDirj) == false) {
bVisited.get(tmpDiri).set(tmpDirj, true);
q.add(new Data(tmpDiri, tmpDirj));
}
}
}
}
}
}
}
int normal = red + blue + green;
int rb = blue + redgreen;
System.out.print(normal + " " + rb);
}
}