[백준] 10026 – 적록색약

쉬운 목차

문제

#10026: 적록 색약 (acmicpc.net)

10026호: 적록색약

적녹맹인 사람은 적색과 녹색을 거의 구분하지 못합니다.

따라서 적녹 결핍이 있는 사람이 보는 이미지는 적녹 결핍이 없는 사람이 보는 이미지와 약간 다를 수 있습니다.

크기가 N×N인 그리드의 각 셀에 있는 R(빨간색) 및 G(녹색)

www.acmicpc.net

설명

BFS로 해결했습니다.

색맹 여부를 확인하기 위해 방문한 배열에 공백이 추가되고 색맹이면 true를, 그렇지 않으면 false를 저장합니다.

색약을 분류하기 위해 BFS 함수 내부에 if 문을 만들 수도 있습니다.

#include <iostream>
#include <queue>
using namespace std;
char picture(101)(101);
bool visited(101)(101)(2);
int N, dx(4) = {0, 0, 1, -1}, dy(4) = {1, -1, 0, 0};

void BFS(int x, int y, bool weakness, char color) {
    queue<pair<int, int>> q;
    q.push({x, y});
    visited(x)(y)(weakness) = true;
    
    while (!
q.empty()) { pair<int, int> now = q.front(); q.pop(); for (int i = 0; i < 4; i++) { int nx = now.first + dx(i); int ny = now.second + dy(i); if (nx < 0 || nx >= N || ny < 0 || ny >= N || visited(nx)(ny)(weakness)) continue; if (weakness == false) { if (picture(nx)(ny) == color) { visited(nx)(ny)(weakness) = true; q.push({nx, ny}); } } else { if (color == picture(nx)(ny)) { visited(nx)(ny)(weakness) = true; q.push({nx, ny}); } else if ((color == 'G' && picture(nx)(ny) == 'R') || (color == 'R' && picture(nx)(ny) == 'G')) { visited(nx)(ny)(weakness) = true; q.push({nx, ny}); } } } } } int main() { cin >> N; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cin >> picture(i)(j); } } int normal = 0, weakness = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { char now = picture(i)(j); if (!
visited(i)(j)(0)) { BFS(i, j, false, now); normal++; } if (!
visited(i)(j)(1)) { BFS(i, j, true, now); weakness++; } } } cout << normal << " " << weakness; return 0; }