728x90
반응형
https://www.acmicpc.net/problem/10026
10026번: 적록색약
적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)
www.acmicpc.net
내가 적록색약이라 적록색약자의 불편함을 알기에 공감하면서 푼 문제였다.
BFS로 구현 했다.
입력받을때부터 일반인의 그림과 적록 색약의 그림을 나누어 저장했으며 저장한 그림을 매개변수로 받는 solve 함수를 작성했다.
solve 함수는 전체 그림을 선회하며 방문하지 않은 칸을 방문하는데 한번 방문하면 같은 색인 영역을 다 확인하여 방문처리를 하고 cnt를 1 증가시키는 방식으로 코드를 작성했다.
반응형
//
// Created by 임익주 on 2023/03/21.
//
#include "iostream"
#include "queue"
#define R 1
#define G 2
#define B 3
using namespace std;
int n;
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
int solve(int paint[101][101]){
bool visited[101][101] = {false, };
int cnt = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(!visited[i][j]){
queue<pair<int, int>> Q;
Q.push({i, j});
visited[i][j] = true;
while (!Q.empty()) {
pair<int, int> u = Q.front();
Q.pop();
for (int k = 0; k < 4; k++) {
int nx = u.first+ dx[k];
int ny = u.second + dy[k];
if (nx < 1 || nx > n || ny < 1 || ny > n)
continue;
if (visited[nx][ny] || paint[nx][ny] != paint[u.first][u.second])
continue;
Q.push({nx, ny});
visited[nx][ny] = true;
}
}
cnt++;
}
}
}
return cnt;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int paint[101][101]; //일반인이 보는 그림
int paint_n[101][101]; //적록색약자가 보는 그림
cin >> n;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
char color;
cin >> color;
if(color == 'R') {
paint[i][j] = R;
paint_n[i][j] = R;
}
else if(color == 'G'){
paint[i][j] = G;
paint_n[i][j] = R;
}
else if(color == 'B'){
paint[i][j] = B;
paint_n[i][j] = B;
}
}
}
cout << solve(paint) << " " << solve(paint_n);
return 0;
}
728x90
반응형
'Algorithm' 카테고리의 다른 글
[백준] BOJ 1655 가운데를 말해요(CPP) (0) | 2023.05.25 |
---|---|
[백준] BOJ 7576 토마토(CPP) (0) | 2023.05.24 |