거북이의 IT 공부

[백준 10026] 적록색약 - C++ / 알고리즘 BFS 본문

Baekjoon

[백준 10026] 적록색약 - C++ / 알고리즘 BFS

버니빈 2020. 4. 15. 22:46

문제

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

 

10026번: 적록색약

문제 적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은

www.acmicpc.net

나의 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <queue>

using namespace std;

queue <pair<int, int> >	q;
char pill[101][101];
bool dist[101][101];
int direct[4][2] = { {0,-1},{0,1},{-1,0},{1,0} };
int n;

int not_redgreen() {
	int number = 0; //영역 개수

	for(int y = 1;y <= n;y++)
		for (int x = 1; x <= n; x++) {
			if (dist[y][x] != true) {
				char now_pill = pill[y][x];
				q.push(make_pair(x, y));
				dist[y][x] = true; //들른 곳
				number++; //영역 카운트

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

					for (int i = 0; i < 4; i++) {
						pair<int, int> next = make_pair(now.first + direct[i][0], now.second + direct[i][1]);
						if (next.first >= 1 && next.first <= n && next.second >= 1 && next.second <= n && dist[next.second][next.first] != true && now_pill == pill[next.second][next.first]) {
							q.push(next);
							dist[next.second][next.first] = true;
						}
					}
				}
			}
		}
	return number;
}

int redgreen() {
	int number = 0; //영역 개수

	for (int y = 1; y <= n; y++)
		for (int x = 1; x <= n; x++) {
			if (dist[y][x] != true) {
				if (pill[y][x] == 'G')
					pill[y][x] = 'R';
				char now_pill = pill[y][x];
				q.push(make_pair(x, y));
				dist[y][x] = true; //들른 곳
				number++; //영역 카운트

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

					for (int i = 0; i < 4; i++) {
						pair<int, int> next = make_pair(now.first + direct[i][0], now.second + direct[i][1]);
						if (pill[next.second][next.first] == 'G')
							pill[next.second][next.first] = 'R';

						if (next.first >= 1 && next.first <= n && next.second >= 1 && next.second <= n && dist[next.second][next.first] != true && now_pill == pill[next.second][next.first]) {
							q.push(next);
							dist[next.second][next.first] = true;
						}
					}
				}
			}
		}
	return number;
}

int main(void) {
	cin >> n;
	cin.ignore(); //엔터키 무시

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			dist[i][j] = false;
			scanf("%1c", &pill[i][j]);
		}
		cin.ignore(); //엔터키 무시
	}

	cout << not_redgreen() << ' '; 
	for (int i = 1; i <= n; i++) 
		for (int j = 1; j <= n; j++)
			dist[i][j] = false;
	cout << redgreen() << '\n';
}  

 

배운점

1. cin.ignore(); //엔터키 무시

cin, scanf 모두 엔터키를 저장하므로 그 다음 문자가 엔터키가 입력되는 문제가 발생한다.

따라서 엔터키를 무시하는 문구가 필요하다.

Comments