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

[BOJ] 2842 : ์ง‘๋ฐฐ์› ํ•œ์ƒ๋•

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

2842๋ฒˆ: ์ง‘๋ฐฐ์› ํ•œ์ƒ๋• (acmicpc.net)

 

2842๋ฒˆ: ์ง‘๋ฐฐ์› ํ•œ์ƒ๋•

์ƒ๋•์ด๋Š” ์–ธ๋• ์œ„์— ์žˆ๋Š” ๋งˆ์„์˜ ์šฐ์ฒด๊ตญ์— ์ง์—…์„ ์–ป์—ˆ๋‹ค. ๋งˆ์„์€ N×N ํ–‰๋ ฌ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ํ–‰๋ ฌ๋กœ ๋‚˜๋‰˜์–ด์ง„ ๊ฐ ์ง€์—ญ์€ ์šฐ์ฒด๊ตญ์€ 'P', ์ง‘์€ 'K', ๋ชฉ์ดˆ์ง€๋Š” '.' ์ค‘ ํ•˜๋‚˜๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋˜, ๊ฐ

www.acmicpc.net

ํˆฌํฌ์ธํ„ฐ์™€ BFS๊ฐ€ ํ•ฉ์ณ์ง„ ์žฌ๋ฐŒ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

 

์ฐธ๊ณ  ๋งํฌ

https://dar0m.tistory.com/77

 

[C++] vector ๋ฐฐ์—ด ์ค‘๋ณต ์ œ๊ฑฐ ํ•˜๋Š” ๋ฒ•

๋ฐฐ์—ด ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฒ• vector  v ๋ฅผ ์œ ์ผํ•œ ์›์†Œ๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด, ์ •๋ ฌ์„ ํ•œ๋‹ค. : sort ์—ฐ์†๋œ ์ค‘๋ณต ์›์†Œ๋ฅผ vector์˜ ์ œ์ผ ๋’ท๋ถ€๋ถ„(์“ฐ๋ ˆ๊ธฐ ๊ฐ’)์œผ๋กœ ๋ณด๋‚ด๋ฒ„๋ฆฐ๋‹ค. : unique ์ค‘๋ณต๋œ ์›์†Œ๋“ค

dar0m.tistory.com

๋ฒกํ„ฐ์—์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฒ•์„ ๊นŒ๋จน์–ด์„œ ๋‹ค๋ฅธ ๋ถ„์˜ ๊ฒŒ์‹œ๋ฌผ์„ ์ฐธ๊ณ ํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ์งฐ๋‹ค.

 

ํ’€์ด

< ์ค€๋น„๋ฌผ >

1. ๋“ค๋Ÿฌ์•ผ ํ•  ์ง‘์ด ์ด ๋ช‡ ๊ตฐ๋ฐ์ธ์ง€ ์„ผ๋‹ค.

2. ์šฐ์ฒด๊ตญ์˜ ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•œ๋‹ค.

3. ๋ชจ๋“  ๊ณ ๋„๋ฅผ ๋‹ค ์ €์žฅํ•˜๊ณ  ์ •๋ ฌํ•œ ํ›„ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ๋‹ค.

๋ฒกํ„ฐ์— ์ €์žฅํ•œ ํ›„ unique() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ผ๋‹จ ์ž…๋ ฅ์„ ๋ฐ›์œผ๋ฉด์„œ ์ด 3๊ฐ€์ง€๋ฅผ ์ค€๋น„ํ•ด์•ผํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ๊ณ ๋„๊ฐ€ ์ €์žฅ๋œ ๋ฒกํ„ฐ๋ฅผ H ๋ฒกํ„ฐ๋ผ๊ณ  ํ•˜์ž.

3
P..
.KK
...
3 2 4
7 4 2
2 3 1โ€‹

์ œ์‹œ๋œ ์˜ˆ์ œ3์„ ์˜ˆ๋กœ ๋“ค๋ฉด, H ๋ฒกํ„ฐ์—๋Š” ์ค‘๋ณต์„ ์ œ๊ฑฐ ํ•œ { 1 2 3 4 7 } ์ด ๋“ค์–ด์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด ๋ฒกํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ์ง‘๋ฐฐ์›์ด ์ด์šฉํ•  ์นธ์˜ ๊ณ ๋„์˜ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•œ๋‹ค. ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•œ ํ›„ BFS ๋ฅผ ์ด์šฉํ•ด์„œ ์ง‘๋ฐฐ์›์ด ๋ชจ๋“  ์šฐํŽธ์„ ๋ฐฐ๋‹ฌ ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€๋ฅผ ํŒ๋ณ„ํ•œ๋‹ค.

ํŒ๋ณ„ : BFS๋ฅผ ๋Œ๋ฉด์„œ ๋ฐฉ๋ฌธํ•œ ์ง‘์˜ ์ˆ˜๊ฐ€ ์ด ์ง‘์˜ ์ˆ˜์™€ ๊ฐ™์•„์ง€๋ฉด ๋ชจ๋“  ์šฐํŽธ ๋ฐฐ๋‹ฌ์„ ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๋‹ค.

 

๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณ ๋„์˜ ๋ฒ”์œ„๋ฅผ H[left] ~ H[right] ๊นŒ์ง€๋ผ๊ณ  ํ•˜๋ฉด, ์ดˆ๊ธฐ๊ฐ’์€ left = 0, right = 0 ์œผ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.

1. ์„ค์ •ํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ ์ง‘๋ฐฐ์›์ด ๋ชจ๋“  ์šฐํŽธ์„ ๋ฐฐ๋‹ฌ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด left๋ฅผ ๋Š˜๋ ค์„œ ๋ฒ”์œ„๋ฅผ ์ขํ˜€์ค€๋‹ค.

2. ์„ค์ •ํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ ์ง‘๋ฐฐ์›์ด ๋ชจ๋“  ์šฐํŽธ์„ ๋ฐฐ๋‹ฌํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด right๋ฅผ ๋Š˜๋ ค์„œ ๋ฒ”์œ„๋ฅผ ๋Š˜๋ ค์ค€๋‹ค.

์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๋ชจ๋“  ์šฐํŽธ์„ ๋ฐฐ๋‹ฌ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ข์€ ๋ฒ”์œ„๋ฅผ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. ๊ณ ๋„์˜ ๋ฒ”์œ„๊ฐ€ ๊ฐ€์žฅ ์ข๋‹ค๋Š” ๊ฒƒ์€ ๊ฐ€์žฅ ๋†’์€ ๊ณ ๋„์™€ ๊ฐ€์žฅ ๋‚ฎ์€ ๊ณ ๋„์˜ ์ฐจ์ด๊ฐ€ ๊ฐ€์žฅ ์ ๋‹ค๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

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

BFS๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์ „์— ์šฐ์ฒด๊ตญ์˜ ๊ณ ๋„๊ฐ€ ์„ค์ •ํ•œ ๋ฒ”์œ„ ๋‚ด์— ๋“ค์–ด์žˆ์„ ๋•Œ BFS ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.

 

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
#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 = 50 + 5;
int dx[] = { 0,1,0,-11,-1,1,-1 };
int dy[] = { 1,0,-1,0-1,1,1,-1 };
char Map[MAX_N][MAX_N];
int height[MAX_N][MAX_N];
bool visited[MAX_N][MAX_N];
vector<int> H;
int N, K;
bool is_ok(pair<intint>);
bool BFS(pair<intint> st, pair<int,int> Range);
 
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N;
    pair<intint> Post;
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cin >> Map[i][j];
            if (Map[i][j] == 'P')
                Post = { i,j };
            else if (Map[i][j] == 'K')
                K++;
        }
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cin >> height[i][j];
            H.push_back(height[i][j]);
        }
    }
    sort(H.begin(), H.end());
    H.erase(unique(H.begin(), H.end()), H.end());
    int left = 0;
    int right = 0;
    int ans = INF;
    while (right < H.size()) {
        while (true) {
            if (height[Post.first][Post.second] > H[right]
                || height[Post.first][Post.second] < H[left])
                break;
            memset(visited, falsesizeof(visited));
            if (BFS(Post, { H[left],H[right] })) {
                ans = min(ans, H[right] - H[left]);
            }
            else break;
            left++;
        }
        right++;
    }
    cout << ans << "\n";
    return 0;
}
bool BFS(pair<intint> st, pair<int,int> Range) {
    queue<pair<intint>> q;
    q.push({ st.first,st.second });
    visited[st.first][st.second] = true;
    int cnt = 0;
    while (!q.empty()) {
        pair<intint> now = q.front();
        q.pop();
        if (Map[now.first][now.second] == 'K') {
            cnt++;
            if (cnt == K) return true;
        }
        for (int i = 0; i < 8; i++) {
            pair<intint> next = { now.first + dy[i], now.second + dx[i] };
            if (is_ok(next)) {
                if (height[next.first][next.second] >= Range.first && height[next.first][next.second] <= Range.second) {
                    q.push(next);
                    visited[next.first][next.second] = true;
                }
            }
        }
    }
    return false;
}
 
bool is_ok(pair<intint> now) {
    if (now.first < 0 || now.first >= N || now.second < 0 || now.second >= N || visited[now.first][now.second])
        return false;
    return true;
}
cs

728x90