728x90
1. 문제 설명
2. 풀이 과정
- 문제 해결의 흐름
- 입력받을 때 일반인과 적록색약인 사람이 보는 구역 배열을 다르게 설정하자.
- 이중for문을 통해 방문처리되지 않은 값에 대해 bfs로 구역을 탐색하며 구역 수를 구하자.
- 나의 코드
//
// 1. 입력 받을 떄 일반인과 적록색약인 사람이 보는 구역 배열을 다르게 설정하자.
// 2. bfs를 통해 현재 행의 구역을 전부 방문 처리하고, 구역 수 += 1
#include <iostream>
#include <queue>
#include <string>
#include <cstring>
using namespace std;
int dr[4] = {0,0,-1,1};
int dc[4] = {1,-1,0,0};
int N;
char r_b_blind_area[101][101];ㅎ
char general_area[101][101];
bool visited[101][101];
void bfs(int row, int col, int flag) {
queue<pair<int ,int> > q;
q.push(make_pair(row, col));
visited[row][col] = true; // 현재 위치 방문 처리
char area[101][101]; // 구역
// flag에 따라 다른 배열의 복사
if (flag == 1) { // 적록색약 아님
memcpy(area, general_area, sizeof(general_area));
} else { // 적록색약임
memcpy(area, r_b_blind_area, sizeof(r_b_blind_area));
}
while(!q.empty()) {
// 현재 행렬
int cur_row = q.front().first;
int cur_col = q.front().second;
q.pop();
int next_row, next_col;
// 상하좌우 탐색
for (int i = 0; i < 4; i++) {
next_row = cur_row + dr[i];
next_col = cur_col + dc[i];
// 범위 밖이면 continue
if (next_row < 0 || next_row >= N || next_col < 0 || next_col >= N) continue;
// 같은 구역이고 방문처리가 안되었다면!
if (area[next_row][next_col] == area[cur_row][cur_col] && !visited[next_row][next_col]) {
q.push(make_pair(next_row, next_col));
visited[next_row][next_col] = true;
}
}
}
}
// 방문 배열 전부 false 넣어주기
void reset() {
for (int i = 0; i < N ; i++) {
for (int j = 0; j < N; j++) {
visited[i][j] = false;
}
}
}
int main() {
// 입력 받기
cin >> N;
for (int i = 0; i < N; i++) {
string str;
cin >> str;
for (int j = 0; j < N; j++) {
if (str[j] == 'G') { // 적록색약은 G를 전부 R로 입력 받자!!
r_b_blind_area[i][j] = 'R';
general_area[i][j] = str[j];
} else {
r_b_blind_area[i][j] = str[j];
general_area[i][j] = str[j];
}
}
}
// bfs 구현
// 1. 일반인이 봤을 때 구역의 수
reset();
int result1 = 0;
for (int i = 0; i < N ; i++) {
for (int j = 0; j < N; j++) {
if (!visited[i][j]) {
bfs(i,j, 1);
result1 += 1;
}
}
}
// 2. 적록색약이 봤을 때 구역의 수
reset();
int result2 = 0;
for (int i = 0; i < N ; i++) {
for (int j = 0; j < N; j++) {
if (!visited[i][j]) {
bfs(i,j, 2);
result2 += 1;
}
}
}
cout << result1 << endl;
cout << result2 << endl;
return 0;
}
- 이 문제를 통해 얻어갈 수 있는 것들
- ⭐️ 2차열 배열을 복사하거나 초기화할 때 이중 for문을 이용하자! (fill_n이나 memcpy를 사용할 수도 있지만 그냥 이중 for문 이용하자)
3. 후기
전형적인 bfs 문제였다!!
'Algorithm > graph' 카테고리의 다른 글
[백준] 12851 숨바꼭질 2 C++ (0) | 2024.04.25 |
---|---|
[백준] 1697 숨바꼭질 C++ (0) | 2024.04.25 |
[백준] 16234 인구이동 C++ (1) | 2024.04.22 |
[백준] 14226 이모티콘 C++ (1) | 2024.04.20 |
[백준] 6593 상범 빌딩 C++ (0) | 2024.04.20 |