새소식

💻 Programming (프로그래밍)/C++ | 백준

[C++][백준] - 적록색약 (10026번)

  • -
https://www.acmicpc.net/problem/10026
 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net

🔔 문제 : 

(1<= N <= 100) 인 N*N인 크기의 픽셀로 이루어진 사진이 있습니다.

 

이 사진에는 RGB 값이 주어지는데요

 

적록색약인 사람은 적색과 녹색의 구분이 잘 안갑니다

 

이를 생각하며, 일반인이 본 색의 영역의 수와, 적록색약을 가진 사람의 색의 영역의 수를 출력하는 문제입니다.

 

예를들면, 일반인은 (빨강 2, 파랑 1, 초록 1)로 4구역이지만 적록색약인 사람은 (빨강초록- 2, 파랑-1)로 3구역만 느껴집니다.


🔔 Kick Point :

처음 입력값을 받을 때, 일반인과 적록색약의 눈을 가진 사람에게 따라 인풋값을 다르게 주었습니다.

 

일반인  0 - 'R',  1 - 'G', 2 - 'B'

적록색약 0 - 'RG' , 2- 'B'

 

이 후 BFS 를 통하여 구역의 수를 구하여 출력해주었습니다.

 


🔔 Code :

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;

int n;
int A[100][100]; // 평범한 눈으로 본 그림 (R, G, B)
int B[100][100]; // 적록색약인 눈으로 본 그림 (RG, B)
bool isVisited[100][100];
int dy[4] = { -1, 1, 0, 0 };
int dx[4] = { 0, 0, -1, 1 };

int BFS(const int arr[][100]) {
	
	queue<pair<int, int>> q;

	int cnt(0);
	for (int i = 0; i < n * n; i++) {
		int y = i / n;
		int x = i % n;
		
		if (isVisited[y][x]) continue;
		q.push({ y,x });

		while (!q.empty()) {
			int _y = q.front().first;
			int _x = q.front().second;
			q.pop();

			for (int i = 0; i < 4; i++) {
				int ny = _y + dy[i];
				int nx = _x + dx[i];
				if (ny < 0 || nx < 0 || ny >= n || nx >= n) continue;
				if (isVisited[ny][nx]) continue;

				if (arr[y][x] == arr[ny][nx])
				{
					q.push({ ny,nx });
					isVisited[ny][nx] = true;
				}
			}
		}
		cnt++;
	}
	return cnt;
}

int main() {

	// Input
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			char tmp; cin >> tmp;
			switch (tmp)
			{
			case 'R':
				A[i][j] = 0;
				B[i][j] = 0;
				break;
			case 'G':
				A[i][j] = 1;
				B[i][j] = 0;
				break;
			case 'B':
				A[i][j] = 2;
				B[i][j] = 1;
				break;
			}
		}
	
	
	}


	// Solve
	memset(isVisited, 0, sizeof(isVisited));
	int cntA = BFS(A);
	memset(isVisited, 0, sizeof(isVisited));
	int cntB = BFS(B);

	// Output
	cout << cntA << ' ' << cntB;
}

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.