알고리즘/백준

백준 22352 항체 인식 c++ [컴공과고씨]

시간빌게이츠 2022. 4. 8. 15:42
반응형

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

 

22352번: 항체 인식

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

www.acmicpc.net

문제를 읽고 bfs를 떠올렸다.

 

아이디어

백신 놓기 전과 결과를 비교한다. 여기서 만약 다른게 나오면 bfs를 돌려서 숫자를 결과의 값으로 바꾸어 주고 백신은 한번만 놓을 수 있기 때문에 비교를 멈춘다. 그 후 바뀐 값과 주어진 결과를 비교해서 하나라도 다른 값이 있다면 no를 다 똑같다면 yes를 출력해주면 된다.

 

 

단계별 풀이

1. 입력값 받을 두 개의 배열 선언

2. 두 값을 비교함

3. 다른 값이 나왔을 경우 bfs를 돌림

4. bfs는 상하좌우로 움직이면서 만약 값이 놓기전 값과 같은 경우 놓은 후 값으로 바꾸어준다.

5. bfs로 바뀐 값과 주어진 결과와 비교하면 다른 값이 있다면 no를 출력한다.

 

 

전체코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <queue>
using namespace std;
int bef[32][32];
int aft[32][32];
int dx[] = {00-11};
int dy[] = {1-100};
int n, m;
 
void bfs(int a,int b,int bf, int af){
    queue<pair<intint>> q;
    q.push(make_pair(a, b));
    while(!q.empty()){
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
 
        for (int i = 0; i < 4;i++){ //상하좌우로 움직임
            int nx = x + dx[i];
            int ny = y + dy[i];
 
            if(nx < m && nx >=0 && ny <&& ny >=0){              
                if(bef[ny][nx] == bf){ // 바뀌어야할 값이면
                    bef[ny][nx] = af; // 결과 값으로 바꾸어 줌
                    q.push(make_pair(nx, ny)); 
                }
            }
        }
    }
}
 
int main(){
    ios::sync_with_stdio(false);
    cin >> n >> m;
    
    for (int i = 0; i < n;i++){
        for (int j = 0; j < m;j++){
            cin >> bef[i][j]; //놓기 전 값
        }
    }
    for (int i = 0; i < n;i++){
        for (int j = 0; j < m;j++){
            cin >> aft[i][j]; // 놓은 후 값
        }
    }
    bool injected = false;
    for (int i = 0; i < n;i++){
        for (int j = 0; j < m;j++){
            if(!injected){ // 백신은 한번만 놓을 수 있음
                if(bef[i][j] != aft[i][j]){
                    bfs(j, i, bef[i][j], aft[i][j]);
                    bef[i][j] = aft[i][j]; // 첫 시작 값 바꾸어줌
                    injected = true;
                }
            }
        }
    }    
    for (int i = 0; i < n;i++){
        for (int j = 0; j < m;j++){
            if(bef[i][j] != aft[i][j]){ // 하나라도 다르면 NO
                cout << "NO"
                return 0;
            }
        }
    }
    cout << "YES";
    return 0;
//25min
cs
체감난이도 걸린시간 참고 사용 알고리즘
25min x BFS(브루트 포스)
반응형