Hello Ocean! 🌼

[C++/백준] 22352. 항체 인식 본문

Algorithm

[C++/백준] 22352. 항체 인식

bba_dda 2021. 9. 14. 20:26
반응형

문제

https://www.acmicpc.net/problem/22352

 

22352번: 항체 인식

첫 번째 줄에는 SP 촬영 결과의 크기를 의미하는 두 정수 $N$과 $M$이 주어진다. ($1 \le N, M \le 30$) 이는 촬영 결과가 세로로 $N$칸, 가로로 $M$칸 크기의 격자라는 것을 의미한다. 다음 $N$개의 줄에는

www.acmicpc.net

풀이

두 배열(before와 after)을 (0, 0)부터 한 칸씩 비교하면서, 값이 다를 때 BFS를 실행해서 before배열의 값을 after배열의 값으로 바꿔준다. 

이렇게 BFS를 돌리고 나서도 두 배열에 값이 다른 칸이 있다면, NO이고 아니면 YES이다. 

 

여기서 주의해야 할 점은, BFS를 "딱 한 번" 돌려야 한다는 것이다. 

아래 예시를 보면 쉽게 이해할 수 있다. 아래 예시의 답은 NO이다. 두 배열은 구역은 동일하게 나뉘어져 있지만, 구역을 채우고 있는 숫자가 다른 부분이 두 군데이기 때문이다. 이런 경우에 BFS를 여러번 돌리게 한다면 두 배열에 대한 결과는 YES가 나오게 된다. 따라서 BFS를 한 번만 돌리도록 처리를 해주어야 한다. 

2 2 2 1        3 3 3 1

2 2 1 2        3 3 1 3

2 1 2 2        3 1 3 3 

1 2 2 2        1 3 3 3

  

코드

#include <iostream>
#include <queue>

using namespace std;

int before[31][31];
int after[31][31];
bool visited[31][31];
int N, M;

int dr[4] = { -1,1,0,0 };
int dc[4] = { 0,0,-1,1 };

void BFS(int r, int c, int num, int target) {
	visited[r][c] = 1;
	queue<pair<int, int>> q;
	q.push({ r, c });
	while (!q.empty()) {
		int tempR = q.front().first;
		int tempC = q.front().second;
		q.pop();
		before[tempR][tempC] = target;
		for (int i = 0; i < 4; i++) {
			int nextR = tempR + dr[i];
			int nextC = tempC + dc[i];
			if (nextR < 0 || nextR >= N || nextC < 0 || nextC >= M) continue;
			if (!visited[nextR][nextC] && before[nextR][nextC] == num) {
				visited[nextR][nextC] = 1;
				q.push({ nextR, nextC });
			}
		}
	}
}

int main() {
	cin >> N >> M;
	for (int n = 0;n < N;n++) {
		for (int m = 0;m < M;m++) {
			cin >> before[n][m];
		}
	}
	for (int n = 0;n < N;n++) {
		for (int m = 0;m < M;m++) {
			cin >> after[n][m];
		}
	}
	bool flag = 1; //BFS를 딱 한번만 돌리기 위함 
	for (int n = 0;n < N;n++) {
		for (int m = 0;m < M;m++) {
			if (before[n][m] != after[n][m] && flag) {
				BFS(n, m, before[n][m], after[n][m]);
				flag = 0;
			}
		}
	}
	bool result = 1;
	// 검사
	for (int n = 0; n < N; n++) {
		for (int m = 0; m < M; m++)
			if (before[n][m] != after[n][m])
				result = 0;
	}
	if (result) cout << "YES" << endl;
	else cout << "NO" << endl;
	return 0;
}

결과

반응형

'Algorithm' 카테고리의 다른 글

[백준/C++] 4195. 친구 네트워크  (0) 2021.09.28
[백준/C++] 1253. 좋다  (0) 2021.09.28
[백준/C++] 14725. 개미굴  (0) 2021.09.07
[백준/C++] 17370. 육각형 우리 속의 개미  (0) 2021.08.24
[백준/C++] 1941. 소문난 칠공주  (0) 2021.08.24