프로그래밍 공부
BOJ/백준 22352 항체 인식 본문
https://www.acmicpc.net/problem/22352
22352번: 항체 인식
첫 번째 줄에는 SP 촬영 결과의 크기를 의미하는 두 정수 $N$과 $M$이 주어진다. ($1 \le N, M \le 30$) 이는 촬영 결과가 세로로 $N$칸, 가로로 $M$칸 크기의 격자라는 것을 의미한다. 다음 $N$개의 줄에는
www.acmicpc.net
언어 : C++17
환경 : VSCode gcc 8.1.0
아이디어
BFS를 활용하여 해결할 수 있을 거 같아서 BFS를 사용해서 해결했다
처음에는 모든 점에 대해서 BFS를 할까 생각했으나 잘 생각해보니 서로 다른 값을 가진 한 개의 인덱스에서 BFS를
돌린 후 배열이 같지 않다면 백신일 가능성이 없으니 서로 다른 값을 가진 한 개의 인덱스에 대해서만 BFS를 했다.
코드
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
int arr[100][100];
int vis[100][100];
int after[100][100];
int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};
bool __cmp(int n, int m){ // 배열을 비교
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(arr[i][j] != after[i][j]) return false;
}
}
return true;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n,m;
cin >> n >> m;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> arr[i][j];
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> after[i][j];
}
}
bool inject = false; // BFS를 돌린적이 있는지 없는지 판별하는 변수
for(int i = 0; i < n; i++){
if(inject) break; // 한번 주사 했으면 더 이상 주사 할 필요가 없음
for(int j = 0; j < m; j++){
if(vis[i][j] || arr[i][j] == after[i][j]) continue;
// 두 배열이 같거나 이미 방문한 적이 있으면 continue
inject = true; // BFS를 돌렸다고(주사를 놓았다고) 표시
queue<pair<int,int>> Q;
Q.push({i,j});
int key = arr[i][j]; // 원래 arr[i][j]의 값을 저장
arr[i][j] = after[i][j];
vis[i][j] = 1;
while(!Q.empty()){
auto cur = Q.front(); Q.pop();
for(int dir = 0; dir < 4; dir++){
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if(arr[nx][ny] != key || vis[nx][ny]) continue;
Q.push({nx,ny});
vis[nx][ny] = 1;
arr[nx][ny] = after[i][j]; // 원래 arr 인덱스의 값을 바꿔줌
}
}
}
}
if(__cmp(n,m)) cout << "YES"; // 같으면
else cout << "NO"; // 다르면
return 0;
}
결과
'Problem Solving > Baekjoon Online Judge' 카테고리의 다른 글
BOJ/백준 25497 기술 연계마스터 임스 (0) | 2024.08.10 |
---|---|
BOJ/백준 3015 오아시스 재결합 (0) | 2024.08.10 |
BOJ/백준 7568 덩치 (0) | 2021.07.21 |
BOJ/백준 13459 숨바꼭질 3 (0) | 2021.07.05 |
BOJ/백준 15921 수찬은 마린보이야!! (0) | 2021.06.29 |
Comments