-
백준 10026 적록색약Algorithm/그래프 2021. 12. 10. 15:02728x90
https://www.acmicpc.net/status?user_id=totw2018&problem_id=10026&from_mine=1
- 그래프 탐색 알고리즘 문제이다. 시간복잡도는 그래프 탐색 + 문자 치환 탐색 + 그래프 탐색 해서 총 O(n^2)이다.
- 특이하게, 입력을 문자열들로 준다. 따라서 필자는 string 자료형으로 총 n번을 입력받고, 입력 받을 때 마다 문자 하나하나를 char 배열 map에 저장을 했다. 또한, 처음 주어진 map에서 BFS 한 번, 이 후 맵의 G를 모두 R 문자로 바꿔준 다음 또 한 번 BFS를 진행하였다. 이러한 점 외에는 다른 그래프 탐색 문제와 크게 다를 것이 없다.
-
여담으로, 15분만에 문제를 풀어내서 뿌듯하다. 나도 이제 중수 쯤 됬을까#include <iostream> #include <queue> #include <string> #include <cstring> using namespace std; char map[101][101]; bool visited[101][101]; int n, answer; int dx[] = { 0,0,1,-1 }; int dy[] = { -1,1,0,0 }; void bfs(int s_x, int s_y) { answer++; queue<pair<int, int>> q; visited[s_x][s_y] = true; q.push({ s_x, s_y }); while (!q.empty()) { int x = q.front().first; int y = q.front().second; q.pop(); for (int k = 0; k < 4; k++) { int nx = x + dx[k]; int ny = y + dy[k]; if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue; if (visited[nx][ny]) continue; if (map[x][y] != map[nx][ny]) continue; visited[nx][ny] = true; q.push({ nx,ny }); } } } int main() { cin >> n; for (int i = 0; i < n; i++) { string temp; cin >> temp; for (int j = 0; j < n; j++) { map[i][j] = temp[j]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (!visited[i][j]) bfs(i, j); } } cout << answer << ' '; answer = 0; memset(visited, false, sizeof(visited)); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (map[i][j] == 'G') map[i][j] = 'R'; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (!visited[i][j]) bfs(i, j); } } cout << answer; return 0; }
'Algorithm > 그래프' 카테고리의 다른 글
백준 14940 쉬운 최단거리 (0) 2022.01.05 [프로그래머스] 여행 경로 (0) 2021.12.31 백준 7569 토마토 (0) 2021.12.04 백준 1260 DFS와 BFS (0) 2021.11.13 백준 14502 연구소 (0) 2021.11.12