๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์ค€/Platinum

[BOJ] 3197 : ๋ฐฑ์กฐ์˜ ํ˜ธ์ˆ˜

by Jaeguk 2022. 3. 8.
๋ฌธ์ œ ๋งํฌ

3197๋ฒˆ: ๋ฐฑ์กฐ์˜ ํ˜ธ์ˆ˜ (acmicpc.net)

 

3197๋ฒˆ: ๋ฐฑ์กฐ์˜ ํ˜ธ์ˆ˜

์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์—๋Š” R๊ณผ C๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹จ, 1 ≤ R, C ≤ 1500. ๋‹ค์Œ R๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ๊ฐ ๊ธธ์ด C์˜ ๋ฌธ์ž์—ด์ด ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. '.'์€ ๋ฌผ ๊ณต๊ฐ„, 'X'๋Š” ๋น™ํŒ ๊ณต๊ฐ„, 'L'์€ ๋ฐฑ์กฐ๊ฐ€ ์žˆ๋Š” ๊ณต๊ฐ„์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค.

www.acmicpc.net

๋น™ํŒ์— ๋ง‰ํ˜€ ์„œ๋กœ ๋งŒ๋‚  ์ˆ˜ ์—†๋Š” ๋‘ ๋ฐฑ์กฐ๊ฐ€ ๋น™ํŒ์ด ๋…น์•„ ๋งŒ๋‚˜๊ธฐ ์œ„ํ•ด์„  ๋ฉฐ์น ์ด ๊ฑธ๋ฆฌ๋Š”์ง€ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ.

'.'์€ ๋ฌผ, 'X'๋Š” ๋น™ํŒ 'L'์€ ๋ฐฑ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๋ฌผ๊ณผ ์ธ์ ‘ํ•œ ๋น™ํŒ์€ ํ•˜๋ฃจ์— ๊ฑธ์ณ ๋…น๋Š”๋‹ค.

 

ํ’€์ด

์ฒ˜์Œ์— ๋ฌธ์ œ๋ฅผ ์ œ๋Œ€๋กœ ์•ˆ ์ฝ์–ด์„œ ๋‘ ๋ฐฑ์กฐ๊ฐ€ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋กœ ๋งŒ๋‚˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋‚ ์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ธ ์ค„ ์•Œ์•˜๋‹ค. ๊ทธ๋ž˜์„œ ํ•œ์ฐธ์„ ํ—›๊ณ ์ƒํ•˜๋‹ค๊ฐ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„๋ฅ˜๊ฐ€ ๋‹ค์ต์ŠคํŠธ๋ผ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์„ ๋ณด๊ณ  ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์ฝ์—ˆ๋‹ค ใ… ใ… .

์ด ๋ฌธ์ œ๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๋‘ ๋ฐฑ์กฐ๊ฐ€ ์„œ๋กœ ๋งŒ๋‚  ์ˆ˜ ์žˆ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. Union-Find๋ฅผ ์ด์šฉํ•ด์„œ ๋‘ ๋ฐฑ์กฐ๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์•ˆ์— ์žˆ๋‹ค๋ฉด ๋‘ ๋ฐฑ์กฐ๋Š” ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•œ๋‹ค

1. ์ž…๋ ฅ๋ฐ›์„ ๋•Œ, ์ž…๋ ฅ์ด L์ด๋ฉด ๋ฐฑ์กฐ์ด๋ฏ€๋กœ ๊ทธ ์œ„์น˜๋ฅผ L1, L2์— ๊ฐ๊ฐ ์ €์žฅํ•œ๋‹ค.  ๋˜ํ•œ ์ž…๋ ฅ์ด ๋ฌผ( . )์ด๋ฉด ํ์— ๊ทธ ์ขŒํ‘œ๋ฅผ ๋„ฃ๋Š”๋‹ค. ์ž…๋ ฅ์ด ๋น™ํŒ( X )์ด๋ฉด ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•  ๊ฑด ์—†๋‹ค.

๋‚˜๋Š” water๋ผ๋Š” ํ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฌผ์˜ ์ขŒํ‘œ๋ฅผ ์ €์žฅํ–ˆ๋‹ค.

โ€ป ์ฃผ์˜ํ•ด์•ผํ•  ์ 

์ฒ˜์Œ ์ž…๋ ฅ์— ์ž…๋ ฅ๋ฐ›์„ ๋•Œ ๋ฐฑ์กฐ๊ฐ€ ์žˆ๋Š” ๊ณต๊ฐ„๋„ ๋ฌผ์ด๋ฏ€๋กœ ๋ฐฑ์กฐ๊ฐ€ ์žˆ๋Š” ์ขŒํ‘œ๋„ water ํ์— ์ง‘์–ด ๋„ฃ์–ด์ค€๋‹ค.

 

2.  water์— ์ €์žฅ๋œ ์ขŒํ‘œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ BFS๋กœ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค. ๋งŒ์•ฝ ์ธ์ ‘ํ•œ ๋ถ€๋ถ„์ด ๋ฌผ์ด๋ฉด ๋ฌผ๋ผ๋ฆฌ๋Š” ์ด์–ด์ ธ์•ผํ•˜๋ฏ€๋กœ Union์„ ํ†ตํ•ด ๊ฒฐํ•ฉํ•œ๋‹ค. ์ธ์ ‘ํ•œ ๋ถ€๋ถ„์ด ๋น™ํŒ์ด๋ฉด ์ด ๋ถ€๋ถ„์„ ๋ฌผ๋กœ ๋งŒ๋“ค๊ณ  Union์„ ํ†ตํ•ด ๊ฒฐํ•ฉํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋น™ํŒ์—์„œ ๋ฌผ๋กœ ๋ฐ”๋€Œ์—ˆ์œผ๋ฏ€๋กœ ๊ทธ ์ขŒํ‘œ๋Š” water ํ์— ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋„ฃ๋Š”๋‹ค.

 

3. ์ƒํ•˜์ขŒ์šฐ ๋ชจ๋‘ Union ํ•œ ํ›„ ๋งŒ์•ฝ L1(๋ฐฑ์กฐ1) ๊ณผ L2(๋ฐฑ์กฐ2)๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์žˆ๋‹ค๋ฉด, ์ฆ‰ Parent๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋ฌผ๊ธธ์ด ์ด์–ด์ง„ ๊ฒƒ์ด๋ฏ€๋กœ ๊ทธ๋•Œ๊นŒ์ง€ ๊ฑธ๋ฆฐ ๋‚ ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๋‚ด๊ฐ€ ๋งŒ๋‚œ ๋ฐ˜๋ก€
1 17
LXX.XXL

์ž…๋ ฅ์ด ์ด๋ ‡๊ฒŒ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋Œ€๋กœ๋ผ๋ฉด water ํ์—๋Š” L, . , L์˜ ์ขŒํ‘œ๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๊ณ 

1์ผ์ฐจ์— L....L ์ด ๋˜๋ฏ€๋กœ ๋‹ต์€ 1์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ฒ˜์Œ ๋‚ด๊ฐ€ ์ง  ์ฝ”๋“œ๋Š” 1์ผ์ฐจ ํ›„ {'L' , '.'}, {'.' , '.' , '.'}, {'.' , 'L'} ์ด๋ ‡๊ฒŒ ์„ธ ์ง‘ํ•ฉ์œผ๋กœ ๋‚˜๋ˆ ์ ธ L1๊ณผ L2๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ ์ƒ์— ์—†๋Š” ๊ฒƒ์œผ๋กœ ํŒ์ •๋˜๊ณ  2์ผ์ฐจ์— ๋ชจ๋‘ ๊ฐ™์€ ์ง‘ํ•ฉ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋ผ์„œ 2๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

์ธ์ ‘ํ•œ ๋ถ€๋ถ„์ด 'X'(๋น™ํŒ)์ผ ๊ฒฝ์šฐ 'X'(๋น™ํŒ)๋ฅผ '.'(๋ฌผ) ์œผ๋กœ ๋ฐ”๊พธ๊ณ , ๋‹ค์‹œ ์ด ๊ณต๊ฐ„(๋น™ํŒ์ด์—ˆ๋˜ ๋ถ€๋ถ„)๊ณผ ์ธ์ ‘ํ•œ ๋ถ€๋ถ„์ด ๋ฌผ์ด๋ผ๋ฉด Union์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๊ทธ ๋ถ€๋ถ„์ด ์ด ์ฝ”๋“œ์— ๋“ค์–ด์žˆ๋‹ค.

 if (is_ok(next)) {
                if (Map[next.first][next.second] == 'X') { // ๋ฌผ๋กœ ๋งŒ๋“ค์–ด์•ผํ•จ
                    Map[next.first][next.second] = '.';
                    Union(now, next);
                    for (int j = 0; j < 4; j++) {
                        pair<int, int> next_next = { next.first + dy[i], next.second + dx[i] };
                        if (is_ok(next_next)) {
                            if (Map[next_next.first][next_next.second] == '.') {
                                if (Find(next) != Find(next_next))
                                    Union(next, next_next);
                            }
                        }
                    }
                    water.push({ next, day + 1 });
                }
}โ€‹

์ข…ํ•ฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์งœ๋ณด๋ฉด

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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef priority_queue<pair<pair<intint>int>vector<pair<pair<intint>int>>, greater<pair<pair<intint>int>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 1500 + 5;
char Map[MAX_N][MAX_N];
int R, C;
queue<pair<pair<intint>int>> water;
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };
pair<intint> Trace[MAX_N][MAX_N];
pair<intint> Parent[MAX_N][MAX_N];
 
pair<intint> Find(pair<intint> X) {
    if (Parent[X.first][X.second] == X)
        return X;
    return Parent[X.first][X.second] = Find(Parent[X.first][X.second]);
}
 
void Union(pair<intint> X, pair<intint> Y) {
    pair<intint> parent_x = Find(X);
    pair<intint>parent_y = Find(Y);
    Parent[parent_y.first][parent_y.second] = parent_x;
}
 
 
bool is_ok(pair<intint>);
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> R >> C;
    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
            Parent[i][j] = { i,j };
        }
    }
    pair<intint> L1, L2;
    bool chk = false;
    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
            cin >> Map[i][j];
            if (Map[i][j] == '.')
                water.push({ { i,j }, 0 });
            else if (Map[i][j] == 'L' && !chk) {
                L1 = { i,j };
                water.push({ { i,j }, 0 });
                chk = true;
            }
            else if (Map[i][j] == 'L' && chk) {
                water.push({ { i,j }, 0 });
                L2 = { i,j };
            }
        }
    }
    while (!water.empty()) {
        pair<intint> now = water.front().first;
        int day = water.front().second;
        water.pop();
        for (int i = 0; i < 4; i++) {
            pair<intint> next = { now.first + dy[i], now.second + dx[i] };
            if (is_ok(next)) {
                if (Map[next.first][next.second] == 'X') { // ๋ฌผ๋กœ ๋งŒ๋“ค์–ด์•ผํ•จ
                    Map[next.first][next.second] = '.';
                    Union(now, next);
                    for (int j = 0; j < 4; j++) {
                        pair<intint> next_next = { next.first + dy[i], next.second + dx[i] };
                        if (is_ok(next_next)) {
                            if (Map[next_next.first][next_next.second] == '.') {
                                if (Find(next) != Find(next_next))
                                    Union(next, next_next);
                            }
                        }
                    }
                    water.push({ next, day + 1 });
                }
                else if (Map[next.first][next.second] == '.') {
                    if (Find(now) != Find(next))
                        Union(now, next);
                }
            }
        }
        if (Find(L1) == Find(L2)) { //์ธ์ ‘ํ•œ ๋ถ€๋ถ„์„ ๋‹ค ๋…น์ธ ํ›„, L1๊ณผ L2๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์žˆ๋‹ค๋ฉด
            cout << day + 1 << "\n";
            break;
        }
    }
    return 0;
}
 
bool is_ok(pair<intint> now) {
    if (now.first < 0 || now.first >= R || now.second < 0 || now.second >= C)
        return false;
    return true;
}
cs

 

728x90