문제 링크
풀이
간단한 bfs/dfs문제이다. 붙어있는 같은 데이터들을 모두 탐색하면서, before와 after가 다른 세트가 2세트 이상 있다면 No를 출력하면 되는 문제다. 필자는 bfs로 구현했다.
코드
#include <cstdio>
#include <queue>
using namespace std;
int before[32][32], after[32][32];
bool visited[32][32];
queue<pair<int, int>> q;
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int main() {
int n, m; scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf("%d", &before[i][j]);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf("%d", &after[i][j]);
bool flag = true;
int cnt = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (!visited[i][j]) q.push({i, j});
if (!q.empty() && before[i][j] != after[i][j]) cnt++;
while (!q.empty()) {
auto [y, x] = q.front();
q.pop();
visited[y][x] = true;
for (int k = 0; k < 4; k++) {
int ny = y + dir[k][0], nx = x + dir[k][1];
if (ny < 1 || nx < 1 || ny > n || nx > m) continue;
if (before[ny][nx] == before[i][j] && !visited[ny][nx]) {
q.push({ny, nx});
if (after[ny][nx] != after[i][j]) flag = false;
}
}
}
}
}
if (flag && cnt < 2) printf("YES");
else printf("NO");
}
'Algorithm > BOJ' 카테고리의 다른 글
백준[13976] 타일 채우기 2 (0) | 2021.10.05 |
---|---|
백준[15961] 회전초밥 (0) | 2021.10.02 |
백준[22965] k개의 부분 배열 (0) | 2021.10.01 |
백준[1120] 문자열 (0) | 2021.09.29 |
백준[19951] 태상이의 훈련소 생활 (0) | 2021.09.28 |