ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Baekjoon - 22352] 항체 인식
    문제 풀이/Baekjoon Online Judge 2023. 2. 10. 16:22

    난이도: Gold V

     

    태그

    더보기
    • Depth-First Search

     

    풀이

    1. (y, x)에 값 a의 백신을 투여한다면?

    더보기

    (y, x)와 연결된 위치들의 값들을 DFS를 돌려가면서 a로 바꿔주면 됩니다.

    DFS 한 번으로 백신을 놓는 시뮬레이션을 할 수 있다는 의미죠.

     

    2. 백신을 투여했다고 확신할 수 있는 위치는?

    더보기

    백신 투여 이전과 이후의 값이 달라진 위치가 있다면, 그 위치는 반드시 백신의 영향을 받은 위치가 되죠.

    하나의 연결 요소에 대해서, 연결 요소의 어느 위치에 백신을 놓든 결과는 동일하기 때문에

    그냥 그 위치에 백신을 놓았다 라고 가정하고, 시뮬레이션을 돌려준 뒤, 실제 결과랑 비교해주면 됩니다.

     

    만약 이전과 이후의 차이가 없다면, 그냥 적당한 위치에 이전/이후의 값이 동일한 백신을 놓았다고 볼 수 있습니다.

     

    3. 구현 디테일

    더보기

    아래 코드에서는, 몇몇가지 사실을 사용해서 DFS를 간단히 돌립니다.

    • 이전과 이후의 차이가 반드시 있으므로, visited[y][x]를 따로 관리할 필요 없이
      그냥 map[y][x]의 값이 이전 값이랑 동일한지만 보면 됩니다.
    • 격자판 바깥으로 나가는 경우는, 격자판 바깥의 값이 기본값 (0)으로 초기화되어있다면
      격자판 안에 있는 값들은 1 이상이기 때문에 알아서 걸러집니다.

     

    4. 코드

    더보기
    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
    int mp1[32][32], mp2[32][32];
    void dfs(int y, int x, int v, int w){
        mp1[y][x] = w;
        for (int d = 0; d < 4; d++){
            int yy = y+dy[d], xx = x+dx[d];
            if (mp1[yy][xx] == v){ dfs(yy, xx, v, w); }
        }
    }
     
    void Main(){
        int n, m; cin >> n >> m;
        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= m; j++){ cin >> mp1[i][j]; }
        }
        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= m; j++){ cin >> mp2[i][j]; }
        }
        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= m; j++){
                if (mp1[i][j] != mp2[i][j]){
                    dfs(i, j, mp1[i][j], mp2[i][j]);
                    for (int y = 1; y <= n; y++){
                        for (int x = 1; x <= m; x++){
                            if (mp1[y][x] != mp2[y][x]){ cout << "NO"return; }
                        }
                    }
                    cout << "YES"return;
                }
            }
        }
        cout << "YES";
    }
    cs

    '문제 풀이 > Baekjoon Online Judge' 카테고리의 다른 글

    [Baekjoon - 26532] Acres  (0) 2023.02.13
    [Baekjoon - 27324] ゾロ目 (Same Numbers)  (0) 2023.02.13
    [BOJ 4749] Take Your Vitamins  (0) 2023.02.09
    [27331] 2 桁の整数 (Two-digit Integer)  (0) 2023.02.08
    [26082] WARBOY  (0) 2023.02.08
Designed by Tistory.