알고리즘 공부

백준 적록색약(복습)

컴퓨터과학 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);

	}

}