https://www.acmicpc.net/problem/10026
R G B 각각으로 이루어진 영역의 개수를 찾으면 되는 문제였다.
추가적인 경우는 R과 G를 같게 보고 위의 작업을 반복해주면 된다.
첫 번째 경우를 처리한 이후에 R성분을 G로 바꿔서 같은 작업을 반복했다.
주의할 사항은 입력을 받는 것이다. m을 이차원 char 배열로 잡아두고, string으로 한 줄씩 입력을 받았다.
#pragma warning(disable:4996) #include<iostream> using namespace std; char m[101][101]; bool vis[101][101]; int N; int dr[4] = { 0,0,1, -1 }; int dc[4] = { 1,-1,0,0 }; int cnt1 = 0, cnt2 = 0; bool norCheck(int nr, int nc, char c) { if (nr < 0 || nc < 0 || nr >= N || nc >= N || vis[nr][nc] || m[nr][nc] != c) return true; else return false; } void dfs(int row, int col, char c) { vis[row][col] = true; for (int i = 0; i < 4; i++) { int nr = row + dr[i]; int nc = col + dc[i]; if (norCheck(nr, nc, c)) continue; dfs(nr, nc, c); } } int main(void) { cin >> N; for (int i = 0; i < N; i++) { cin >> m[i]; } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (!vis[i][j]) { dfs(i, j, m[i][j]); cnt1++; } } } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (m[i][j] == 'R') m[i][j] = 'G'; vis[i][j] = false; } } for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (!vis[i][j]) { dfs(i, j, m[i][j]); cnt2++; } } } cout << cnt1 << ' ' << cnt2 << '\n'; return 0; }
'알고리즘 문제 풀이 > 백준 온라인 저지' 카테고리의 다른 글
백준 15663번: N과 M (9) (C++) (0) | 2019.07.19 |
---|---|
백준 15657번: N과 M (8) (C++) (0) | 2019.07.19 |
백준 7562번: 나이트의 이동 (C++) (0) | 2019.07.19 |
백준 15656번: N과 M (7) (C++) (0) | 2019.07.18 |
백준 2667번: 단지번호붙이기 (DFS) (C++) (0) | 2019.07.18 |