CodingTest Practice/BOJ (Baekjoon Online Judge)

백준 10026 : 적록색약 (C++ , BFS)

몽땅마니아(MDD) 2021. 12. 8. 01:25

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

 

10026번: 적록색약

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

www.acmicpc.net

골드 문제 혼자서 처음 풀어봤다...

https://github.com/MongDDangmania/solving_BOJ/blob/main/BFS/10026

#include <iostream>
#include <vector>
#include <queue>
#include <string>
using namespace std;

int N;
vector<string> v; //문자를 담을 2차원 벡터
bool check[101][101]; //방문 여부 표시, 1: 방문
int dx[4] = { 0 ,0, -1, 1 };
int dy[4] = { -1, 1 , 0, 0 };

int answer_norm = 0;
int answer_abnorm = 0;

//BFS 수행
void bfs(int y, int x) {
	queue<pair <int, int>> q;
	q.push({ y, x });
	char c = v[y][x];
	check[y][x] = true;
	while (!q.empty()) {
		pair<int, int> p = q.front();
		q.pop();
		for (int i = 0; i < 4; i++) {
			int nx = p.second + dx[i], ny = p.first + dy[i];
			if (nx < 0 || nx >= N || ny < 0 || ny >= N) continue;
			if (check[ny][nx] || v[ny][nx] != c) continue;
			q.push({ ny,nx });
			check[ny][nx] = true; //방문 표시
		}
	}
}


int main(void) {

	cin >> N;

	for (int i = 0; i < N; i++) {
		string s;
		cin >> s;
		v.push_back(s);
	}


	for (int j = 0; j < N; j++) {
		for (int i = 0;  i < N; i++) {
			if (!check[j][i]) {
				bfs(j, i);
				answer_norm++;
			}
		}
	}

	fill(&check[0][0], &check[N - 1][N], 0); //check배열 0으로 초기화

	// G를 모두 R로 바꾸기
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			if (v[i][j] == 'G') 
				v[i][j] = 'R';
		}
	}

	for (int j = 0; j < N; j++) {
		for (int i = 0; i < N; i++) {
			if (!check[j][i]) {
				bfs(j, i);
				answer_abnorm++;
			}
		}
	}

	cout << answer_norm << endl << answer_abnorm << endl;

	return 0;
}

 

한가지 걸리는 점은 fill함수를 쓰는데 배열 인덱스 참조 오류 주의가 떴다는 거.... 혹시 어떤 방법으로 배열을 초기화해야 주의 표시 없이 되는지 아시는 분은 의견좀 남겨주세요...