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함수를 쓰는데 배열 인덱스 참조 오류 주의가 떴다는 거.... 혹시 어떤 방법으로 배열을 초기화해야 주의 표시 없이 되는지 아시는 분은 의견좀 남겨주세요...
'CodingTest Practice > BOJ (Baekjoon Online Judge)' 카테고리의 다른 글
백준 7562 : 나이트의 이동 (C++, BFS) (0) | 2021.12.22 |
---|---|
백준 1920 : 수 찾기 (C++, 이분탐색) (0) | 2021.12.11 |
백준 2003 : 수들의 합 2 (C++, 투포인터 알고리즘 기초) (0) | 2021.12.11 |
백준 1012 : 유기농 배추 (C++, BFS) (2) | 2021.12.07 |
백준 1926번: 그림 C++코드 (0) | 2021.08.15 |