BOJ/[ BOJ ] C++

[ C++ ] #10026 적록색약

haena02 2023. 2. 9. 04:09
반응형


영역찾기는 전에도 해봤지만, 이번에는 각 색의 영역을 찾아야한다..ㅠ
그리고 두케이스를 봐야한다.

먼저 나는 color배열랑 Ncolor배열응 만들어 색약이 아닌 사람과 색약인 사람의 배열을 분리했다.
Ncolor에는 G와 R이 있다면 1을 넣었다.
그리고 color배열에서 RGB로 세번 영역을 찾고
Ncolor배열에서 1로 영역을 찾아야겠다고 생각했다.

한참 코드를 짜다가 생각났는데 배열이 하나만 있어도 충분히 가능할 것 같았다.
BFS조건만 좀 수정하면되니까...
근데 이미 코드를 너무 많이 짜서 킵고잉하자..!
(뒤늦게 생각난건데 배열하나로 진행하려면 방문했는지 확인하는 배열이 필요하기때문이 메모리는 똑같을 것 같다 ㅎㅎ)

이야!! 성공했다!
짜잘짜잘한 오류가 있었지만 전에 비해 훨씬 빠르게 해결한 것 같다 ㅎㅎ

#include<iostream>
#include<string>
#include<queue>
#include<vector>

using namespace std;

char color[101][101];
char Ncolor[101][101];
int dx[4] = { 0,0,-1,1 };
int dy[4] = { -1,1,0,0 };
int N;


int main() {

	
	int C = 0, NC = 0;
	string a;
	queue<pair<int, int>> Q;
	

	cin >> N;

	//배열 두종류 적기
	for (int i = 0; i < N; i++) {
		cin >> color[i];
		for (int j = 0; j < N;j++) {
			if (color[i][j]== 'G'|| color[i][j] == 'R') {
				Ncolor[i][j] = '1'; 
			}
			else {
				Ncolor[i][j] = '0';
			}
		}
	}

	//color에서 탐색하기
	//blue탐색
	while (1) {
		for (int i = 0; i < N; i++) { //blue 탐색
			for (int j = 0; j < N; j++) {
				if (color[i][j] == 'B') {
					Q.push({ i,j });
					C++; NC++;
					color[i][j] = '0';
					goto flag;
				}
			}
		} break;
		//BFS
	flag:

		while (!Q.empty()) {
			pair<int, int> C = Q.front();
			Q.pop();

			for (int i = 0; i < 4; i++) {

				int nx = C.first + dx[i];
				int ny = C.second + dy[i];

				if (nx < 0 || ny < 0 || nx >= N || ny >= N) continue;
				if (color[nx][ny] != 'B' || color[nx][ny] == '0') continue;

				Q.push({ nx,ny });
				color[nx][ny] = '0';
			}
		}
	}


	//red탐색
	while (1) {
		for (int i = 0; i < N; i++) { 
			for (int j = 0; j < N; j++) {
				if (color[i][j] == 'R') {
					Q.push({ i,j });
					color[i][j] = '0';
					C++;
					goto flag0;
				}
			}
		} break;
		//BFS
	flag0:

		while (!Q.empty()) {
			pair<int, int> C = Q.front();
			Q.pop();

			for (int i = 0; i < 4; i++) {

				int nx = C.first + dx[i];
				int ny = C.second + dy[i];

				if (nx < 0 || ny < 0 || nx >= N || ny >= N) continue;
				if (color[nx][ny] != 'R' || color[nx][ny] == '0') continue;

				Q.push({ nx,ny });
				color[nx][ny] = '0';
			}
		}
	}

	//grean
	while (1) {
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				if (color[i][j] == 'G') {
					Q.push({ i,j });
					color[i][j] = '0';
					C++;
					goto flag1;
				}
			}
		} break;
		//BFS
	flag1:

		while (!Q.empty()) {
			pair<int, int> C = Q.front();
			Q.pop();

			for (int i = 0; i < 4; i++) {

				int nx = C.first + dx[i];
				int ny = C.second + dy[i];

				if (nx < 0 || ny < 0 || nx >= N || ny >= N) continue;
				if (color[nx][ny] != 'G' || color[nx][ny] == 0) continue;

				Q.push({ nx,ny });
				color[nx][ny] = '0';
			}
		}
	}


	//색약

	while (1) {
		for (int i = 0; i < N; i++) { 
			for (int j = 0; j < N; j++) {
				if (Ncolor[i][j] == '1') {
					Q.push({ i,j });
					NC++;
					Ncolor[i][j] = '0';
					goto flag2;
				}
			}
		} break;
		//BFS
	flag2:

		while (!Q.empty()) {
			pair<int, int> C = Q.front();
			Q.pop();

			for (int i = 0; i < 4; i++) {

				int nx = C.first + dx[i];
				int ny = C.second + dy[i];

				if (nx < 0 || ny < 0 || nx >= N || ny >= N) continue;
				if ( Ncolor[nx][ny] =='0') continue;

				Q.push({ nx,ny });
				Ncolor[nx][ny] = '0';
			}
		}
	}

	cout << C << " " << NC;
}
반응형

'BOJ > [ BOJ ] C++' 카테고리의 다른 글

[ C++ ] #11729 하노이 탑 이동 순서  (0) 2023.02.24
[ C++ ] #1629 곱셈  (0) 2023.02.17
[ C++ ] #1012 유기농 배추  (2) 2023.01.29
[ C++ ] #1697 숨바꼭질  (0) 2023.01.27
[ C++ ] #4179 불!  (0) 2023.01.26