2024 BOJ STUDY

์ง„ํ–‰ ๊ธฐ๊ฐ„ : 2024-01-14 ~ 2024-05-08

๐Ÿ”— Github Link

โฏ g++ --version
 
Apple clang version 15.0.0 (clang-1500.1.0.2.5)
Target: arm64-apple-darwin23.2.0
Thread model: posix
 
# compile
โฏ g++ -g -Wall -std=c++17 -o <file_name> <file_name>.cpp

Content


16์ฃผ์ฐจ

๋ชฉ์ฐจ

5639. ์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

์ด์ง„ ๊ฒ€์ƒ‰ ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ์„ ๋งŒ์กฑํ•œ๋‹ค.

์ „์œ„ ์ˆœํšŒ (๋ฃจํŠธ - ์™ผ์ชฝ - ์˜ค๋ฅธ์ชฝ)๋กœ ๋ฐฉ๋ฌธํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ,
ํ›„์œ„ ์ˆœํšŒ (์™ผ์ชฝ - ์˜ค๋ฅธ์ชฝ - ๋ฃจํŠธ)๋กœ ๋ฐฉ๋ฌธํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์ž.

Binary Search Tree
Binary Search Tree

(์˜ˆ์‹œ ์ž…๋ ฅ)
50
30
24
5
28
45
98
52
60

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

์ „์œ„ ์ˆœํšŒ๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋งจ์ฒ˜์Œ ์ž…๋ ฅ์ด ๋ฃจํŠธ์ด๋‹ค.

์˜ˆ์‹œ ๊ธฐ์ค€์œผ๋กœ, 50๋ณด๋‹ค ์ž‘์€ ์ž…๋ ฅ์€ ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์ด๋‹ค.

๋ฃจํŠธ: 50, ์™ผ์ชฝ: [30, 24, 5, 28, 45], ์˜ค๋ฅธ์ชฝ: [98, 52, 60]

์ด ํ–‰์œ„๋ฅผ ๊ฐ ์„œ๋ธŒํŠธ๋ฆฌ๋งˆ๋‹ค ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

#include <iostream>
#include <vector>
using namespace std;
 
vector<int> v;
 
void recur(int s, int e) {
    if (s >= e) return;
    // NOTE : ๋…ธ๋“œ๊ฐ€ 1๊ฐœ๋ผ๋ฉด ๊ทธ๋ƒฅ ํƒ์ƒ‰ํ•˜๋ฉด ๋œ๋‹ค
    if (s == e-1) {
        cout << v[s] << '\n';
        return;
    }
 
    int idx = s+1;
    // NOTE : ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” ์ธ๋ฑ์Šค ๋ฒ”์œ„๋ฅผ ์ฐพ๋Š”๋‹ค
    while (idx < e) {
        if (v[s] < v[idx]) break;
        ++idx;
    }
 
    // NOTE : ํ›„์œ„ ์ˆœํšŒ : ์™ผ์ชฝ - ์˜ค๋ฅธ์ชฝ - ๋ฃจํŠธ
    recur(s+1, idx); recur(idx, e); cout << v[s] << '\n';
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    int x;
    while (cin >> x) { v.push_back(x); }
    recur(0, v.size());
    return 0;
}
 

1915. ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜•

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

n x m ์˜ 0๊ณผ 1๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง„๋‹ค.
์ด๋•Œ, 1๋กœ ๋œ ๊ฐ€์žฅ ํฐ ์ •์‚ฌ๊ฐํ˜• ํฌ๊ธฐ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์ž.

(์˜ˆ์‹œ ์ž…๋ ฅ)
4 4 => n, m
0100
0111
1110
0010

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

์ขŒ์ƒ๋‹จ 0,0 ๋ถ€ํ„ฐ ๋‚ด๋ ค๊ฐ€๋ฉฐ 2์ฐจ์› ๋ฐฐ์—ด์„ ์กฐ์‚ฌํ•˜๋Š”๋ฐ,
0์ด ์•„๋‹Œ ๊ฐ’์— ๋Œ€ํ•ด์„œ๋งŒ ์ฃผ๋ชฉํ•œ๋‹ค.
0์ด๋ฉด ์• ์ดˆ์— ์ •์‚ฌ๊ฐํ˜•์„ ๋งŒ๋“ค ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด์ œ dp๋ฅผ ์ ์šฉํ•œ๋‹ค.
์šฐ์ธกํ•˜๋‹จ ๊ผญ์ง€์ ์„ ๊ธฐ์ค€์œผ๋กœ,
์™ผ์ชฝ, ์œ„์ชฝ, ์™ผ์ชฝ์ƒ๋‹จ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ์ •์‚ฌ๊ฐํ˜•์ด ๋งŒ๋“ค์–ด์ง€๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

map[i][j] = min(map[i-1][j], min(map[i][j-1], map[i-1][j-1])) + 1;

3๊ฐœ์˜ ๋ฐฉํ–ฅ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์„ ํƒํ•ด
1์„ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. (ํ˜„์žฌ 0์•„๋‹Œ i, j ์—์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ •์‚ฌ๊ฐํ˜•์˜ ์ตœ๋Œ€ ํฌ๊ธฐ)

#include <iostream>
using namespace std;
#define MAX 1001
int n,m;
int map[MAX][MAX];
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> n >> m;
 
    char c;
    for (int i=1; i<=n; ++i) {
        for (int j=1; j<=m; ++j) {
            cin >> c;
            map[i][j] = c - '0';
        }
    }
 
    int ans = 0;
    for (int i=1; i<=n; ++i) {
        for (int j=1; j<=m; ++j) {
            if (map[i][j] == 0) continue;
            map[i][j] = min(
                map[i-1][j],
                min(map[i][j-1], map[i-1][j-1])
            ) + 1;
            ans = max(ans , map[i][j]);
        }
    }
    cout << ans*ans;
    return 0;
}

Review

2212. ์„ผ์„œ

๐Ÿ”— BOJ Link

17609. ํšŒ๋ฌธ

๐Ÿ”— BOJ Link

2293. ๋™์ „ 1

๐Ÿ”— BOJ Link

21608. ์ƒ์–ด ์ดˆ๋“ฑํ•™๊ต

๐Ÿ”— BOJ Link

1941. ์†Œ๋ฌธ๋‚œ ์น ๊ณต์ฃผ

๐Ÿ”— BOJ Link

15486. ํ‡ด์‚ฌ 2

๐Ÿ”— BOJ Link


15์ฃผ์ฐจ

๋ชฉ์ฐจ

1715. ์นด๋“œ ์ •๋ ฌํ•˜๊ธฐ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

์ˆซ์ž ์นด๋“œ ๋ฌถ์Œ๋“ค์ด ์ฑ…์ƒ ์œ„์— ๋†“์—ฌ ์žˆ๋‹ค.

๋‘ ๋ฌถ์Œ์”ฉ ๊ณจ๋ผ ์„œ๋กœ ํ•ฉ์ณ๋‚˜๊ฐ„๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ,
๊ณ ๋ฅด๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ์„œ ๋น„๊ต ํšŸ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, [10์žฅ, 20์žฅ, 40์žฅ] ์˜ ์นด๋“œ ๋ฌถ์Œ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

N ๊ฐœ์˜ ์ˆซ์ž ์นด๋“œ ๋ฌถ์Œ์˜ ๊ฐ๊ฐ ํฌ๊ธฐ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ,
์ตœ์†Œ ๋ช‡ ๋ฒˆ์˜ ๋น„๊ต๊ฐ€ ํ•„์š”ํ•œ์ง€ ๊ตฌํ•ด๋ณด์ž.

(์˜ˆ์‹œ ์ž…๋ ฅ)
3 => ์นด๋“œ ๋ฌถ์Œ์˜ ๊ฐœ์ˆ˜ N
10
20
40

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

์œ„ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์˜€๋‹ค.

ํ•ฉ์ณ์ง„ ์นด๋“œ ๋ฌถ์Œ๋“ค์€ ๋‹ค์Œ ๋ฒˆ์—๋„ ๊ณ„์† ๋น„๊ต๋Œ€์ƒ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ,
์ด ํฌ๊ธฐ๋ฅผ ์ดˆ๋ฐ˜๋ถ€ํ„ฐ ์ตœ์†Œ๋กœ ๋งŒ๋“ค์–ด ๋†“์•„์•ผ
๊ฒฐ๊ณผ์ ์œผ๋กœ ์ตœ์†Œ ๋น„๊ต ํšŸ์ˆ˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ์นด๋“œ ์žฅ์ˆ˜์— ๋Œ€ํ•œ ์ตœ์†Œํž™์„ ๋งŒ๋“ค๊ณ 
๋งŒ๋“  ์นด๋“œ ๋ฌถ์Œ์„ ๋‹ค์‹œ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ์œผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
using ll = long long;
int N;
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N;
    // NOTE : ์ตœ์†Œํž™
    priority_queue<ll, vector<ll>, greater<ll>> pq;
    for (int i=0; i<N; ++i) {
        ll x; cin >> x; pq.push(x);
    }
 
    ll ans = 0;
    while (pq.size() > 1) {
        ll t1 = pq.top(); pq.pop();
        ll t2 = pq.top(); pq.pop();
        ans += t1+t2;
        pq.push(t1+t2);
    }
    cout << ans;
 
    return 0;
}

1744. ์ˆ˜ ๋ฌถ๊ธฐ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

๊ธธ์ด๊ฐ€ N์ธ ์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์ด ์ˆ˜์—ด์˜ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค.

๋‹จ, ์ผ๋ฐ˜์ ์ธ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
์ˆ˜์—ด์˜ ๋‘ ์ˆ˜๋ฅผ ๋ฌถ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ–ˆ์„ ๋•Œ์˜ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค.

๋ฌถ๋Š”๋‹ค := ์–ด๋–ค ์ˆ˜๋ฅผ ๋ฌถ๊ฒŒ ๋˜๋ฉด ์„œ๋กœ ๊ณฑํ•œ ํ›„์— ๋”ํ•œ๋‹ค

์–ด๋–ค ์ˆ˜์—ด์ด [0, 1, 2, 4, 3, 5] ์ผ ๋•Œ

๊ฐ ์ˆ˜๋Š” ์ž๊ธฐ ์ž์‹ ๊ณผ ๋ฌถ์ผ ์ˆ˜ ์—†์œผ๋ฉฐ,
๋‹จ ํ•œ๋ฒˆ๋งŒ ๋ฌถ์ผ ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๋ฌถ์ด์ง€ ์•Š์•„์•ผํ•œ๋‹ค.

์ด๋•Œ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๊ฒŒ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์ž.

(์˜ˆ์‹œ ์ž…๋ ฅ)
4 => ์ˆ˜์—ด์˜ ๊ธธ์ด N
-1
2
1
3

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

์Œ์ˆ˜๋Š” ์Œ์ˆ˜๋ผ๋ฆฌ, ์–‘์ˆ˜๋Š” ์–‘์ˆ˜๋ผ๋ฆฌ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

์Œ์ˆ˜ ๋ฐฐ์—ด์€ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ, ์ •๋ ฌํ•˜์—ฌ ๊ณฑํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด๋œ๋‹ค.

์–‘์ˆ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์•ฝ๊ฐ„ ๊ณ ๋ คํ•ด์•ผํ•  ๊ฒƒ์ด ์žˆ๋Š”๋ฐ,
1์˜ ์กด์žฌ ๋•Œ๋ฌธ์ด๋‹ค.

1์ด ์กด์žฌํ•  ๊ฒฝ์šฐ ๋ฌถ์ง€๋ง๊ณ  ๋”ํ•˜๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผํ•œ๋‹ค.
์ด๊ฒƒ๋งŒ ์ฃผ์˜ํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N;
vector<int> Minus, Plus;
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N;
 
    for (int i=0; i<N; ++i) {
        int x; cin >> x;
        if (x <= 0) Minus.push_back(x);
        else Plus.push_back(x);
    }
 
    sort(Minus.begin(), Minus.end(), less<int>());
    sort(Plus.begin(), Plus.end(), greater<int>());
 
    int ans = 0;
 
    // NOTE : ์ง์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™€์ˆ˜ ๊ธธ์ด์ธ ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰ ์›์†Œ๋ฅผ ๋ฏธ๋ฆฌ ์ถ”๊ฐ€
    if (Minus.size() & 1) ans += Minus.back();
    for (int i=0; i< (int)Minus.size()-1; i+=2) {
        ans += Minus[i] * Minus[i+1];
    }
 
    if (Plus.size() & 1) ans += Plus.back();
    for (int i=0; i< (int)Plus.size()-1; i+=2) {
        // NOTE : 1์ผ ๊ฒฝ์šฐ ๋”ํ•˜๋Š” ๊ฒƒ์ด ๋” ํฌ๋‹ค
        if (Plus[i+1] == 1) ans += Plus[i] + Plus[i+1];
        else ans += Plus[i] * Plus[i+1];
    }
 
    cout << ans;
    return 0;
}

Review

1939. ์ค‘๋Ÿ‰์ œํ•œ

๐Ÿ”— BOJ Link

1956. ์šด๋™

๐Ÿ”— BOJ Link

21610. ๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋น„๋ฐ”๋ผ๊ธฐ

๐Ÿ”— BOJ Link

1943. ๋™์ „ ๋ถ„๋ฐฐ

๐Ÿ”— BOJ Link

20366. ๊ฐ™์ด ๋ˆˆ์‚ฌ๋žŒ ๋งŒ๋“ค๋ž˜?

๐Ÿ”— BOJ Link

5022. ์—ฐ๊ฒฐ

๐Ÿ”— BOJ Link


14์ฃผ์ฐจ

๋ชฉ์ฐจ

1339. ๋‹จ์–ด ์ˆ˜ํ•™

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋‹จ์–ด N๊ฐœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๊ฐ๊ฐ์˜ ์•ŒํŒŒ๋ฒณ์„ 0~9 ์‚ฌ์ด์˜ ์ˆซ์ž๋กœ ๋ฐ”๊ฟ”์„œ N๊ฐœ์˜ ์ˆ˜๋ฅผ ํ•ฉํ•˜๋Š”๋ฐ,
์ด๋•Œ ์ˆ˜์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋„๋ก ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

GCF + ACDEB = 99437

๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ

๋กœ ๋ฐ”๊พธ๋ฉด ์ตœ๋Œ€๊ฐ€ ๋œ๋‹ค.

(์˜ˆ์‹œ ์ž…๋ ฅ)
2 => ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜ N
AAA
AAA

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

๊ทธ๋ฆฌ๋””๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.
๊ฐœ์ธ์ ์œผ๋กœ๋Š” ๊ทธ๋ฆฌ๋””์— ๋Œ€ํ•œ ์ •์˜๋ฅผ ์ž˜๋ชป ์„ธ์›Œ์„œ ํŒจ์Šค์‹œํ‚ค๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค.

  1. ๋” ๋งŽ์ด ์•ž ์ž๋ฆฌ์— ์œ„์น˜
  2. ๋” ๋งŽ์€ ๋นˆ๋„์ˆ˜

์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ๊นŒ ๋ฐ˜๋ฐ•์ด ๋˜๋Š” ์‚ฌ๋ก€

ABC
BCA

์ˆœํ™˜ํ˜•์œผ๋กœ ์ฃผ์–ด์งˆ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

๋”ฐ๋ผ์„œ 10์ง„๋ฒ• ํ‘œํ˜„์‹์œผ๋กœ ๊ฐ ์•ŒํŒŒ๋ฒณ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์„œ
ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int N;
int alpha_cnt[26];
 
bool cmp(int a, int b) {
    return a > b;
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    
    cin >> N;
    string s;
 
    for (int i=0; i<N; ++i) {
        cin >> s;
        int p = 1;
        for (int j=s.length()-1; j>=0; --j) {
            alpha_cnt[s[j] - 'A'] += p;
            p *= 10;
        }
    }
 
    sort(alpha_cnt, alpha_cnt+26, cmp);
 
    int ans = 0;
    int d = 9;
    for (int i=0; i<26; ++i) {
        if (alpha_cnt[i] == 0) continue;
 
        ans += alpha_cnt[i] * d;
        --d;
    }
    cout << ans;
    return 0;
}

17472. ๋‹ค๋ฆฌ ๋งŒ๋“ค๊ธฐ 2

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

N X M ํฌ๊ธฐ์˜ ์ง€๋„๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
์ง€๋„์˜ ๊ฐ ์นธ์€ ๋•… ๋˜๋Š” ๋ฐ”๋‹ค์ด๋‹ค.

์„ฌ์ด๋ž€ ๋•…์ด ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.

๋ชจ๋“  ์„ฌ์„ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฆฌ๋ฅผ ๊ฑด์„คํ•˜๋ ค๊ณ  ํ–ˆ์„ ๋•Œ,
์ตœ์†Œ์˜ ๋น„์šฉ์œผ๋กœ ๋ชจ๋“  ์„ฌ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์ž.

์—ฐ๊ฒฐ๋˜๊ธฐ ์ „ ์„ฌ๋“ค์˜ ๋ชจ์Šต
์—ฐ๊ฒฐ๋˜๊ธฐ ์ „ ์„ฌ๋“ค์˜ ๋ชจ์Šต

์—ฐ๊ฒฐ๋œ ํ›„ ์„ฌ๋“ค์˜ ๋ชจ์Šต
์—ฐ๊ฒฐ๋œ ํ›„ ์„ฌ๋“ค์˜ ๋ชจ์Šต

(์˜ˆ์‹œ ์ž…๋ ฅ)
7 8 => ์ง€๋„์˜ ํฌ๊ธฐ N, M
0 0 0 0 0 0 1 1
1 1 0 0 0 0 1 1
1 1 0 0 0 0 0 0
1 1 0 0 0 1 1 0
0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

๋Šฅ๋ ฅ ๋ฐ–์— ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค. ์ฐธ๊ณ ํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ๋‹ค.

์ฒซ๋ฒˆ์งธ ๊ณ ๋ฏผ์ด์—ˆ๋˜ ์ง€์ ์€ ์„ฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์•Œ๊ณ ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ,
๊ฐ ์„ฌ ์‚ฌ์ด์˜ ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒƒ์ด์—ˆ๋‹ค.

๊ฐ ์„ฌ ๊ฐ„์˜ ๊ด€๊ณ„์— ์ง‘์ค‘ํ•˜๋‹ค๋ณด๋‹ˆ๊นŒ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ค์› ๋˜ ๊ฒƒ ๊ฐ™์•˜๋‹ค.
๊ทธ๋ƒฅ ๋ชจ๋“  ๋•… ์ขŒํ‘œ๋“ค์„ ์ˆœํšŒํ•˜๋ฉฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ–ˆ๋‹ค.
(๋ฏธ๋ฆฌ ์„ฌ๋“ค์˜ id๋“ค์„ ๋ถ€์—ฌํ•ด๋†“์€ ์ƒํƒœ์—์„œ)

์ด๋ ‡๊ฒŒ ์ง€์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฆฌ๋“ค์˜ ํ›„๋ณด๊ตฐ์„ ๋ชจ๋‘ ๊ตฌํ•œ ๋’ค์—

์œ„ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

๋ชจ๋“  vertex (์„ฌ)๋“ค์„ ์—ฐ๊ฒฐํ•˜๋Š”
์ตœ์†Œ ๋น„์šฉ์˜ edge(๋‹ค๋ฆฌ) ์ง‘ํ•ฉ์„ ์ฐพ๋Š” ๋ฌธ์ œ๋กœ ํ™˜์›๋˜๊ธฐ ๋•Œ๋ฌธ์—
์ ํ™•ํ•˜๊ฒŒ ๋Œ€์‘๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define MAX 10
#define ISLAND_MAX 7
 
struct pos {
    int y; int x;
};
 
struct tbridge {
    int len; int start; int end;
};
 
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
 
int N,M;
int map[MAX][MAX];
int island[MAX][MAX];
bool visited[MAX][MAX];
int island_cnt = 0;
vector<pos> land;
vector<tbridge> bridge;
int parent[ISLAND_MAX];
 
bool check_bound(int y, int x) {
    return y>=0 && y<N && x>=0 && x<M;
}
 
bool check(int y, int x) {
    return check_bound(y, x) && !visited[y][x] && map[y][x] == 1;
}
 
// NOTE : bfs๋ฅผ ํ•˜๋ฉฐ ๊ฐ ์„ฌ๋งˆ๋‹ค id (island_cnt)๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค
void numbering_island() {
    for (int i=0; i<land.size(); ++i) {
        int _y = land[i].y, _x = land[i].x;
 
        if (visited[_y][_x]) continue;
 
        queue<pos> q;
        visited[_y][_x] = true;
        island[_y][_x] = ++island_cnt;
        q.push({_y, _x});
 
        while (!q.empty()) {
            int y = q.front().y, x = q.front().x;
            q.pop();
 
            for (int i=0; i<4; ++i) {
                int ny=y+dy[i], nx=x+dx[i];
                if (!check(ny, nx)) continue;
 
                visited[ny][nx] = true;
                island[ny][nx] = island_cnt;
 
                q.push({ny, nx});
            }
        }
    }
}
 
void make_bridge() {
    // NOTE : ๋ชจ๋“  ๋•… ์ขŒํ‘œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฆฌ๋“ค์„ ๋ชจ๋‘ ๊ณ„์‚ฐ
    for (int i=0; i<land.size(); ++i) {
        int y=land[i].y, x=land[i].x;
        int start_island_id = island[y][x];
 
        for (int d=0; d<4; ++d) {
            int ny=y, nx=x;
            int len = 0;
 
            while (1) {
                ny += dy[d]; nx += dx[d];
 
                /**
                 * NOTE
                 * - ๊ฒฝ๊ณ„, ๊ธธ์ด, ๋ฐ”๋‹ค ์œ„์— ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌ
                 * - 0์€ ๋ฐ”๋‹ค, 1์€ ๋•…์„ ์˜๋ฏธํ•œ๋‹ค.
                */
                if (check_bound(ny, nx)) {
                    if (map[ny][nx] == 0) ++len;
                    else if (
                        map[ny][nx] == 1 &&
                        len>=2 &&
                        start_island_id != island[ny][nx]
                    ) {
                        bridge.push_back({len, start_island_id, island[ny][nx]});
                        break;
                    }
                    else break;
                }
                else break;
            }
        }
    }
}
 
int find(int a) {
    if (parent[a] == a) return a;
    return (parent[a] = find(parent[a]));
}
 
// NOTE : ๋‹ค๋ฆฌ id ๊ฐ’์ด ์ž‘์€ ์ชฝ์„ ๋ถ€๋ชจ๋กœ
void uni(int a, int b) {
    int pa = find(a);
    int pb = find(b);
 
    if (pa == pb) return;
 
    if (pa < pb) parent[pb] = pa;
    else parent[pa] = pb;
}
 
bool has_same_parent(int a, int b) {
    return find(a) == find(b);
}
 
bool b_cmp(tbridge& a, tbridge& b) { return a.len < b.len; }
 
int answer() {
    // NOTE : ๋‹ค๋ฆฌ ๊ธธ์ด ์ตœ์†Œํ•ฉ์„ ์–ป์–ด์•ผ ํ•œ๋‹ค
    sort(bridge.begin(), bridge.end(), b_cmp);
 
    for (int i=1; i<=island_cnt; ++i) {
        parent[i] = i;
    }
 
    int total_len = 0;
    for (int i=0; i<bridge.size(); ++i) {
        // NOTE : ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์„ฌ๋“ค์— ๋Œ€ํ•ด union ์—ฐ์‚ฐ์„ ์ง„ํ–‰
        if (!has_same_parent(bridge[i].start, bridge[i].end)) {
            uni(bridge[i].start, bridge[i].end);
            total_len += bridge[i].len;
        }
    }
 
    // NOTE : ๋‹ค๋ฆฌ id ๊ฐ’์ด ์ž‘์€ ์ชฝ์„ ๋ถ€๋ชจ๋กœ ๋’€๊ธฐ ๋•Œ๋ฌธ์— 1์ด ์•„๋‹ˆ๋ฉด ์—ฐ๊ฒฐ๋  ์ˆ˜ ์—†์Œ์„ ๋œปํ•จ
    for (int i=1; i<=island_cnt; ++i) {
        if (find(i) != 1) {
            return -1;
        }
    }
 
    return total_len;
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N >> M;
    
    for (int i=0; i<N; ++i) {
        for (int j=0; j<M; ++j) {
            // NOTE : 0์€ ๋ฐ”๋‹ค, 1์€ ๋•…์„ ์˜๋ฏธํ•œ๋‹ค.
            cin >> map[i][j];
            if (map[i][j] == 1) {
                // NOTE : bridge ํ›„๋ณด๊ตฐ๋“ค์„ ๋งŒ๋“ค๊ธฐ์œ„ํ•ด ์™„ํƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋•…๋“ค์˜ ์ขŒํ‘œ๋ฅผ ๋ฏธ๋ฆฌ ํ™•๋ณด
                land.push_back({i, j});
            }
        }
    }
 
    numbering_island();
    make_bridge();
    cout << answer();
 
    return 0;
}

Review

17836. ๊ณต์ฃผ๋‹˜์„ ๊ตฌํ•ด๋ผ!

๐Ÿ”— BOJ Link

2629. ์–‘ํŒ”์ €์šธ

๐Ÿ”— BOJ Link

2179. ๋น„์Šทํ•œ ๋‹จ์–ด

๐Ÿ”— BOJ Link

14890. ๊ฒฝ์‚ฌ๋กœ

๐Ÿ”— BOJ Link

13549. ์ˆจ๋ฐ”๊ผญ์งˆ 3

๐Ÿ”— BOJ Link

1562. ๊ณ„๋‹จ ์ˆ˜

๐Ÿ”— BOJ Link


13์ฃผ์ฐจ

๋ชฉ์ฐจ

14499. ์ฃผ์‚ฌ์œ„ ๊ตด๋ฆฌ๊ธฐ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

N X M ํฌ๊ธฐ์˜ ์ง€๋„๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
์ง€๋„์˜ ์˜ค๋ฅธ์ชฝ์€ ๋™์ชฝ, ์œ„์ชฝ์€ ๋ถ์ชฝ์ด๋‹ค.

์ฃผ์‚ฌ์œ„๋Š” ์ง€๋„ ์œ„์— ์œ— ๋ฉด์ด 1์ด๊ณ ,
๋™์ชฝ์„ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์ด 3์ธ ์ƒํƒœ๋กœ ๋†“์—ฌ์ ธ ์žˆ๋‹ค.
๊ฐ€์žฅ ์ฒ˜์Œ์— ์ฃผ์‚ฌ์œ„์—๋Š” ๋ชจ๋“  ๋ฉด์— 0์ด ์ ํ˜€์ ธ ์žˆ๋‹ค.

์ฃผ์‚ฌ์œ„๋ฅผ ๊ตด๋ฆด ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค.

์ž…๋ ฅ์œผ๋กœ ์ฃผ์‚ฌ์œ„๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ๋ช…๋ น์ด ์ฃผ์–ด์งˆ ๋•Œ,
์ด๋™ํ–ˆ์„ ๋•Œ๋งˆ๋‹ค ์ฃผ์‚ฌ์œ„์˜ ์œ— ๋ฉด์— ์“ฐ์—ฌ ์žˆ๋Š” ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์ž.

(์˜ˆ์‹œ ์ž…๋ ฅ)
4 2 0 0 8 => ์ง€๋„์˜ ํฌ๊ธฐ N,M, ์ฃผ์‚ฌ์œ„๋ฅผ ๋†“์€ ๊ณณ์˜ ์ขŒํ‘œ y,x, ๋ช…๋ น์˜ ๊ฐœ์ˆ˜ K
0 2 => N๊ฐœ ์ค„์— ๊ฑธ์ณ์„œ ์ง€๋„์˜ ์ •๋ณด
3 4
5 6
7 8
4 4 4 1 3 3 3 2 => ๋ช…๋ น์˜ ์ •๋ณด

๋™์ชฝ์€ 1, ์„œ์ชฝ์€ 2, ๋ถ์ชฝ์€ 3, ๋‚จ์ชฝ์€ 4๋กœ ์ฃผ์–ด์ง„๋‹ค.

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

์ฃผ์‚ฌ์œ„๋ฅผ ๊ตด๋ฆด ๋•Œ๋งˆ๋‹ค top (์œ—๋ฉด) ์ž์ฒด๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€
์•Œ์•„๋‚ด๋ ค๊ณ  ํ—ค๋ฉจ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

๋™์„œ๋‚จ๋ถ ์ด๋™๋ฐฉํ–ฅ์— ๋”ฐ๋ผ์„œ ๊ตฌ๋ฅธ ๋’ค์— ๋ฌด์—‡์ด ์œ—๋ฉด์ธ์ง€ ํŒŒ์•…ํ•˜์ง€ ๋ง์ž.

์ฃผ์–ด์ง„ ์ „๊ฐœ๋„์™€ ์„ธํŒ… (1์ด ์œ—๋ฉด, 3์ด ๋™์ชฝ ๋ฐฉํ–ฅ) ์—์„œ
๊ฐ’ ์ž์ฒด๋ฅผ ์ง์ ‘ ๋ณ€ํ™”์‹œ์ผœ์ฃผ์ž.

#include <iostream>
#include <string>
using namespace std;
#define MAX 20
 
int N,M,sy,sx,K;
int map[MAX][MAX];
// NOTE : ๋™์ชฝ์€ 1, ์„œ์ชฝ์€ 2, ๋ถ์ชฝ์€ 3, ๋‚จ์ชฝ์€ 4๋กœ ์ฃผ์–ด์ง„๋‹ค.
int dy[] = {0, 0, 0, -1, 1};
int dx[] = {0, 1, -1, 0, 0};
int dice[7];
 
bool check(int y, int x) {
    return y>=0 && y<N && x>=0 && x<M;
}
 
void move(int dir) {
    int d1=dice[1], d2=dice[2], d3=dice[3], d4=dice[4], d5=dice[5], d6=dice[6];
 
    // ๋™
    if (dir == 1) {
        dice[1] = d4; dice[3] = d1; dice[6] = d3; dice[4] = d6;
        return;
    }
 
    // ์„œ
    if (dir == 2) {
        dice[1] = d3; dice[3] = d6; dice[6] = d4; dice[4] = d1;
        return;
    }
 
    // ๋ถ
    if (dir == 3) {
        dice[1] = d5; dice[2] = d1; dice[6] = d2; dice[5] = d6;
        return;
    }
 
    // ๋‚จ (dir == 4)
    dice[1] = d2; dice[2] = d6; dice[6] = d5; dice[5] = d1;
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N >> M >> sy >> sx >> K;
 
    for (int i=0; i<N; ++i) {
        for (int j=0; j<M; ++j) {
            cin >> map[i][j];
        }
    }
 
    int dir;
    int y=sy, x=sx;
 
    // NOTE : K๋ฒˆ์— ๊ฑธ์ณ์„œ ์ฃผ์‚ฌ์œ„๋ฅผ ๊ตด๋ฆฐ๋‹ค
    while (K--) {
        cin >> dir;
        int ny=y+dy[dir], nx=x+dx[dir];
 
        // NOTE : ๋งŒ์•ฝ ๋ฐ”๊นฅ์œผ๋กœ ์ด๋™์‹œํ‚ค๋ ค๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ๋ช…๋ น์„ ๋ฌด์‹œํ•ด์•ผ ํ•œ๋‹ค
        if (!check(ny, nx)) continue;
 
        move(dir);
 
        // NOTE : ์ด๋™ํ•œ ์นธ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๊ฐ€ 0์ด๋ฉด, ์ฃผ์‚ฌ์œ„์˜ ๋ฐ”๋‹ฅ๋ฉด์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๊ฐ€ ์นธ์— ๋ณต์‚ฌ๋œ๋‹ค.
        if (map[ny][nx] == 0) map[ny][nx] = dice[6];
        // NOTE : 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ์นธ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๊ฐ€ ์ฃผ์‚ฌ์œ„์˜ ๋ฐ”๋‹ฅ๋ฉด์œผ๋กœ ๋ณต์‚ฌ๋˜๋ฉฐ, ์นธ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๋Š” 0์ด ๋œ๋‹ค.
        else {
            dice[6] = map[ny][nx];
            map[ny][nx] = 0;
        }
 
        // NOTE : ์ฃผ์‚ฌ์œ„๋ฅผ ๊ตด๋ฆฌ๊ณ  ์œ—๋ฉด์„ ์ถœ๋ ฅ
        cout << dice[1] << '\n';
        y = ny; x = nx;
    }
    return 0;
}

17142. ์—ฐ๊ตฌ์†Œ 3

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

N X N ํฌ๊ธฐ์˜ ์—ฐ๊ตฌ์†Œ๊ฐ€ ์žˆ๋‹ค.

๊ฐ ์—ฐ๊ตฌ์†Œ์˜ ์นธ์€ 3์ข…๋ฅ˜ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

๋ฐ”์ด๋Ÿฌ์Šค๋Š” ํ™œ์„ฑ ์ƒํƒœ์™€ ๋น„ํ™œ์„ฑ ์ƒํƒœ๊ฐ€ ์žˆ๋‹ค.
๊ฐ€์žฅ ์ฒ˜์Œ์— ๋ชจ๋“  ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ๋น„ํ™œ์„ฑ ์ƒํƒœ์ด๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ๋ฌป๋Š” ๊ฒƒ์€ ์ฃผ์–ด์ง„ ๋น„ํ™œ์„ฑ ๋ฐ”์ด๋Ÿฌ์Šค ์ค‘์—์„œ
M ๊ฐœ๋ฅผ ํ™œ์„ฑ ์ƒํƒœ๋กœ ๋ฐ”๊พผ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ,
์—ฐ๊ตฌ์†Œ์˜ ๋ชจ๋“  ๋นˆ ์นธ์— ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง€๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ค‘์š”ํ•œ ๊ฒƒ์€ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง€๋Š” / ๋ณต์ œ๋˜๋Š” ์›๋ฆฌ๋‹ค.

(์˜ˆ์‹œ ์ž…๋ ฅ)
7 3 => ์—ฐ๊ตฌ์†Œ์˜ ํฌ๊ธฐ N, ํ™œ์„ฑ ๋ฐ”์ด๋Ÿฌ์Šค์˜ ๊ฐœ์ˆ˜ M
2 0 0 0 1 1 0 => N๊ฐœ ์ค„์— ๊ฑธ์ณ์„œ ์—ฐ๊ตฌ์†Œ์˜ ์ •๋ณด
0 0 1 0 1 2 0
0 1 1 0 1 0 0
0 1 0 0 0 0 0
0 0 0 2 0 1 1
0 1 0 0 0 0 0
2 1 0 0 0 0 2

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

DFS์™€ BFS๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

#include <iostream>
#include <vector>
#include <climits>
#include <queue>
#include <cstring>
using namespace std;
#define MAX 50
#define MAX_VIRUS 2500
 
struct pos {
    int y; int x;
};
 
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
vector<pos> virus;
vector<pos> activated;
bool visited[MAX_VIRUS];
 
int N,M;
int lab[MAX][MAX];
int time_map[MAX][MAX];
int ans = INT_MAX;
 
int empty_cnt = 0;
int infect_cnt = 0;
 
bool check(int y, int x) {
    return y>=0 && y<N && x>=0 && x<N &&
        (lab[y][x] != 1) && (time_map[y][x] == -1);
}
 
int bfs() {
    infect_cnt = 0;
 
    /**
     * NOTE
     * -1๋กœ ์ฒ˜์Œ์— ๊ฐฑ์‹ ํ•˜์—ฌ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํ™•์‚ฐ๋˜์ง€ ์•Š์•˜์Œ์„ ํ‘œ๊ธฐ
    */
    memset(time_map, -1, sizeof(time_map));
 
    queue<pos> q;
    for (const auto& p : activated) {
        q.push(p);
        time_map[p.y][p.x] = 0;
    }
 
    int time = 0;
    while (!q.empty()) {
        auto p = q.front(); q.pop();
        int y = p.y, x = p.x;
 
        for (int i=0; i<4; ++i) {
            int ny=y+dy[i], nx=x+dx[i];
 
            if (!check(ny, nx)) continue;
 
            time_map[ny][nx] = time_map[y][x] + 1;
 
            /**
             * NOTE
             * - ๋นˆ๋•…์ด์—ˆ์„ ๋•Œ์—๋งŒ bfs๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” time์„ ๊ฐฑ์‹ ํ•œ๋‹ค
             * - ์ด๋ฏธ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ์นธ (2) ์ผ ๊ฒฝ์šฐ์—๋Š” ์‹œ๊ฐ„์ด ์†Œ์š”๋˜์ง€ ์•Š๋Š”๋‹ค
            */
            if (lab[ny][nx] == 0) {
                ++infect_cnt;
                time = time_map[ny][nx];
            }
 
            q.push({ny, nx});
        }
    }
    return time;
}
 
void dfs(int x, int cnt) {
    if (cnt == M) {
        int t = bfs();
 
        // NOTE : ๋ชจ๋“  ๋นˆ ์นธ์— ํ™•์‚ฐ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ตœ์†Œ ์‹œ๊ฐ„ ๊ฐฑ์‹  x
        if (empty_cnt == infect_cnt) ans = min(t, ans);
        return;
    }
 
    for (int i=x; i<virus.size(); ++i) {
        if (visited[i]) continue;
        visited[i] = true; activated.push_back(virus[i]);
        dfs(i, cnt+1);
        visited[i] = false; activated.pop_back();
    }
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N >> M;
    for (int i=0; i<N; ++i) {
        for (int j=0; j<N; ++j) {
            cin >> lab[i][j];
 
            // NOTE : virus ์œ„์น˜๋ฅผ ๋ฏธ๋ฆฌ ์ €์žฅํ•ด ๋†“๋Š”๋‹ค
            if (lab[i][j] == 2) virus.push_back({i, j});
 
            // NOTE : ๋ชจ๋“  ๋นˆ์นธ์— ํ™•์‚ฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋นˆ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋†“๋Š”๋‹ค
            else if (lab[i][j] == 0) ++empty_cnt;
        }
    }
 
    dfs(0, 0);
    if (ans == INT_MAX) ans = -1;
    cout << ans;
    return 0;
}

Review

19637. IF๋ฌธ ์ข€ ๋Œ€์‹  ์จ์ค˜

๐Ÿ”— BOJ Link

17822. ์›ํŒ ๋Œ๋ฆฌ๊ธฐ

๐Ÿ”— BOJ Link

9017. ํฌ๋กœ์Šค ์ปจํŠธ๋ฆฌ

๐Ÿ”— BOJ Link

22866. ํƒ‘ ๋ณด๊ธฐ

๐Ÿ”— BOJ Link

2531. ํšŒ์ „ ์ดˆ๋ฐฅ

๐Ÿ”— BOJ Link

2493. ํƒ‘

๐Ÿ”— BOJ Link


12์ฃผ์ฐจ

๋ชฉ์ฐจ

3190. ๋ฑ€

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

N X N ๋ณด๋“œ ์œ„์— ๊ฒŒ์ž„์„ ์ง„ํ–‰ํ•œ๋‹ค.
๋ฑ€์€ ์ด ๋ณด๋“œ ์œ„์—์„œ ๊ธฐ์–ด๋‹ค๋‹ˆ๋Š”๋ฐ ์‚ฌ๊ณผ๋ฅผ ๋จน์œผ๋ฉด ๋ฑ€์˜ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค.

๋ฒฝ or ์ž๊ธฐ์ž์‹ ๊ณผ ๋ถ€๋”ชํžˆ๋ฉด ๊ฒŒ์ž„์ด ๋๋‚œ๋‹ค.

๋ฑ€์€ ์‹œ์ž‘ ๋‹น์‹œ ๋งจ์œ„ ๋งจ์ขŒ์ธก์— ์œ„์น˜ํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ์„ ํ–ฅํ•œ๋‹ค.
์ฒ˜์Œ ๋ฑ€์˜ ๊ธธ์ด๋Š” 1์ด๋‹ค.

๋ฑ€์€ ๋งค์ดˆ๋งˆ๋‹ค ์ด๋™์„ ํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค.

๊ฒŒ์ž„์ด ๋ช‡ ์ดˆ์— ๋๋‚˜๋Š”์ง€ ์ถœ๋ ฅํ•ด๋ณด์ž.

(์˜ˆ์‹œ ์ž…๋ ฅ) 6 => ๋ณด๋“œ ํฌ๊ธฐ N
3 => ์‚ฌ๊ณผ์˜ ๊ฐœ์ˆ˜ K
3 4 => K๊ฐœ ์ค„์— ๊ฑธ์ณ์„œ ์‚ฌ๊ณผ์˜ ์œ„์น˜
2 5
5 3
3 => ๋ฑ€์˜ ๋ฐฉํ–ฅ ๋ณ€ํ™˜ ํšŸ์ˆ˜ L
3 D => L๊ฐœ ์ค„์— ๊ฑธ์ณ์„œ ๋ฐฉํ–ฅ ๋ณ€ํ™˜ ์ •๋ณด
15 L
17 D

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

๋ฑ์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๋ฑ€์˜ ์ด๋™ํ•˜๋Š” ๊ทœ์น™์„ ๋”ฐ๋ผ์„œ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

#include <iostream>
#include <unordered_map>
#include <deque>
using namespace std;
#define BOARD_MAX 101
 
struct snake {
    int y; int x;
};
 
// NOTE : Up, Down, Left, Right ์ˆœ์„œ
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
 
int N,K,L;
unordered_map<int, char> time_to_dir;
bool apple[BOARD_MAX][BOARD_MAX];
 
// NOTE : front: ๊ผฌ๋ฆฌ, back: ๋จธ๋ฆฌ
deque<snake> dq;
// NOTE : ๋ฑ€์€ ์ฒ˜์Œ์— ์˜ค๋ฅธ์ชฝ์„ ํ–ฅํ•œ๋‹ค.
int dir=3;
bool game_over;
 
int dir_converter(char c) {
    if (c == 'L') {
        if (dir == 0) return 2;
        if (dir == 1) return 3;
        if (dir == 2) return 1;
        if (dir == 3) return 0;
    }
 
    if (c == 'D') {
        if (dir == 0) return 3;
        if (dir == 1) return 2;
        if (dir == 2) return 0;
        if (dir == 3) return 1;
    }
 
    return -1;
}
 
bool check_bound(int y, int x) {
    return y>=1 && y<=N && x>=1 && x<=N;
}
 
bool check_itself(int y, int x) {
    for (const auto& p : dq) {
        if (p.y == y && p.x == x) return false;
    }
    return true;
}
 
void rotate(int time) {
    char l_or_d = time_to_dir[time];
    dir = dir_converter(l_or_d);
}
 
void move() {
    // NOTE : dq.back == ๋จธ๋ฆฌ, dq.front == ๊ผฌ๋ฆฌ
    int ny = dq.back().y+dy[dir], nx = dq.back().x+dx[dir];
    
    // NOTE : ๋งŒ์•ฝ ๋ฒฝ์ด๋‚˜ ์ž๊ธฐ์ž์‹ ์˜ ๋ชธ๊ณผ ๋ถ€๋”ชํžˆ๋ฉด ๊ฒŒ์ž„์ด ๋๋‚œ๋‹ค
    if (!check_bound(ny, nx) || !check_itself(ny, nx)) {
        game_over = true;
        return;
    }
 
    dq.push_back({ny, nx});
 
    // NOTE : ๋งŒ์•ฝ ์ด๋™ํ•œ ์นธ์— ์‚ฌ๊ณผ๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ทธ ์นธ์— ์žˆ๋˜ ์‚ฌ๊ณผ๊ฐ€ ์—†์–ด์ง€๊ณ  ๊ผฌ๋ฆฌ๋Š” ์›€์ง์ด์ง€ ์•Š๋Š”๋‹ค
    if (apple[ny][nx]) {
        apple[ny][nx] = false;
    }
    // NOTE : ๋งŒ์•ฝ ์ด๋™ํ•œ ์นธ์— ์‚ฌ๊ณผ๊ฐ€ ์—†๋‹ค๋ฉด, ๋ชธ๊ธธ์ด๋ฅผ ์ค„์—ฌ์„œ ๊ผฌ๋ฆฌ๊ฐ€ ์œ„์น˜ํ•œ ์นธ์„ ๋น„์›Œ์ค€๋‹ค. ์ฆ‰, ๋ชธ๊ธธ์ด๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    else {
        for (int i=0; i<dq.size()-1; ++i) {
            dq[i].y = dq[i+1].y;
            dq[i].x = dq[i+1].x;
        }
        dq.pop_back();
    }
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N >> K;
    int r,c;
    for (int i=0; i<K; ++i) {
        cin >> r >> c;
        apple[r][c] = true;
    }
    cin >> L;
    int t; char d;
    for (int i=0; i<L; ++i) {
        cin >> t >> d;
        time_to_dir.insert({t, d});
    }
 
    int time = 0;
    dq.push_back({1, 1});
    while (1) {
        game_over = false;
 
        // NOTE : ๋จผ์ € ๋ฑ€์€ ๋ชธ๊ธธ์ด๋ฅผ ๋Š˜๋ ค ๋จธ๋ฆฌ๋ฅผ ๋‹ค์Œ์นธ์— ์œ„์น˜์‹œํ‚จ๋‹ค
        move();
        ++time;
 
        if (game_over) break;
 
        // NOTE : ๋ฐฉํ–ฅ์„ ์ „ํ™˜ํ•ด์•ผ ํ•˜๋Š” ์ˆœ๊ฐ„์ด๋ฉด ์ „ํ™˜ํ•œ๋‹ค
        if (time_to_dir.find(time) != time_to_dir.end()) rotate(time);
    }
    cout << time;
    return 0;
}

16235. ๋‚˜๋ฌด ์žฌํ…Œํฌ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

N X N ํฌ๊ธฐ์˜ ๋•…์ด ์žˆ๋‹ค. ๊ฐ ์นธ์€ ์ฒ˜์Œ์— ์–‘๋ถ„์„ 5๋งŒํผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ด ๋•…์— ๋Œ€ํ•ด์„œ ๋‚˜๋ฌด ์ œํ…Œํฌ ๋ผ๋Š” ๊ฒƒ์„ ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋‹ค.
์ด๋ฅผ ์œ„ํ•ด M ๊ฐœ์˜ ๋‚˜๋ฌด๋ฅผ ์‹ฌ์„ ๊ฒƒ์ด๋‹ค.

์‹ฌ์–ด์ง„ ๋‚˜๋ฌด๋“ค์€ ์‚ฌ๊ณ„์ ˆ์„ ๋ณด๋‚ด๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

๋ด„

์—ฌ๋ฆ„

๊ฐ€์„

๊ฒจ์šธ

์ด๋Ÿฐ ๊ณผ์ •์„ K๋…„ ๋™์•ˆ ์ง„ํ–‰ํ•  ๋•Œ,
K๋…„์ด ์ง€๋‚œ ํ›„ ์‚ด์•„์žˆ๋Š” ๋‚˜๋ฌด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์ž.

(์˜ˆ์‹œ ์ž…๋ ฅ)
5 2 1 => ๋•…์˜ ํฌ๊ธฐ N, ๋‚˜๋ฌด์˜ ๊ฐœ์ˆ˜ M, ์ œํ…Œํฌ K๋…„
2 3 2 3 2 => N๊ฐœ ์ค„์— ๊ฑธ์ณ์„œ ๋งค ๊ฒจ์šธ ๊ฐ ์นธ์— ์ฃผ์–ด์ง€๋Š” ์–‘๋ถ„์˜ ์–‘
2 3 2 3 2
2 3 2 3 2
2 3 2 3 2
2 3 2 3 2
2 1 3 => M๊ฐœ ์ค„์— ๊ฑธ์ณ์„œ ๋‚˜๋ฌด์˜ ์ •๋ณด : ๋‚˜๋ฌด ์œ„์น˜ x, y, ๋‚˜์ด z
3 2 3

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define PLANE_MAX 11
using namespace std;
int dy[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dx[] = {-1, 0, 1, -1, 1, -1, 0, 1};
 
 
int N,M,K;
 
// NOTE : ๋งค ๊ฒจ์šธ ์ฑ„์›Œ์ง€๋Š” ์–‘๋ถ„์˜ ์–‘
int plane[PLANE_MAX][PLANE_MAX];
 
// NOTE : ๊ฐ ์นธ์˜ ์–‘๋ถ„ ์ƒํƒœ
int nutrient[PLANE_MAX][PLANE_MAX];
 
/**
 * NOTE
 * - ๊ฐ ์นธ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‚˜๋ฌด๊ฐ€ ๋‹ด๊ธธ ์ˆ˜ ์žˆ๋‹ค
 * - ๋‚˜๋ฌด์˜ ๋‚˜์ด๊ฐ€ ๋‹ด๊ธฐ๊ฒŒ ๋œ๋‹ค
*/
vector<int> tree[PLANE_MAX][PLANE_MAX];
 
bool age_cmp(int a1, int a2) {
    return a1 < a2;
}
 
bool check_bound(int y, int x) {
    return y>=1 && y<=N && x>=1 && x<=N;
}
 
void spring_and_summer() {
    // spring
    for (int y=1; y<=N; ++y) {
        for (int x=1; x<=N; ++x) {
            if (tree[y][x].empty()) continue;
 
            // NOTE : ๊ฐ€์žฅ ์–ด๋ฆฐ ๋‚˜๋ฌด๊ฐ€ ๋จผ์ € ์–‘๋ถ„์„ ๋จน๋Š”๋‹ค
            sort(tree[y][x].begin(), tree[y][x].end(), age_cmp);
 
            // NOTE : ์–‘๋ถ„์„ ์„ญ์ทจํ•˜๊ณ  ๋‚˜์ด๊ฐ€ ๋จน์€ ๋‚˜๋ฌด๋“ค์˜ ๋‚˜์ด๊ฐ€ ๋‹ด๊ธด๋‹ค
            vector<int> tmp;
 
            int die = 0;
 
            for (int i=0; i<tree[y][x].size(); ++i) {
                int age = tree[y][x][i];
 
                if (nutrient[y][x] < age) {
                    die += age/2;
                }
                else {
                    nutrient[y][x] -= age;
                    tmp.push_back(age+1);
                }
            }
 
            tree[y][x].clear();
            for (const auto& n : tmp) {
                tree[y][x].push_back(n);
            }
 
            // summer
            nutrient[y][x] += die;
        }
    }
}
 
void fall() {
    for (int y=1; y<=N; ++y) {
        for (int x=1; x<=N; ++x) {
            if (tree[y][x].empty()) continue;
 
            for (int t=0; t<tree[y][x].size(); ++t) {
                // NOTE : ๋‚˜์ด๊ฐ€ 5์˜ ๋ฐฐ์ˆ˜์—ฌ์•ผ ๋ฒˆ์‹ ๊ฐ€๋Šฅํ•˜๋‹ค
                if (tree[y][x][t]%5 != 0) continue;
 
                for (int i=0; i<8; ++i) {
                    int ny=y+dy[i], nx=x+dx[i];
                    if (!check_bound(ny, nx)) continue;
                    tree[ny][nx].push_back(1);
                }
            }
        }
    }
}
 
void winter() {
    for (int i=1; i<=N; ++i) {
        for (int j=1; j<=N; ++j) {
            nutrient[i][j] += plane[i][j];
        }
    }
}
 
int answer() {
    int cnt = 0;
    for (int i=1; i<=N; ++i) {
        for (int j=1; j<=N; ++j) {
            if (tree[i][j].empty()) continue;
            cnt += tree[i][j].size();
        }
    }
    return cnt;
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N >> M >> K;
    for (int i=1; i<=N; ++i) {
        for (int j=1; j<=N; ++j) {
            cin >> plane[i][j];
            nutrient[i][j] = 5;
        }
    }
 
    int y,x,age;
    for (int i=0; i<M; ++i) {
        cin >> y >> x >> age;
        tree[y][x].push_back(age);
    }
 
    while (K--) {
        spring_and_summer();
        fall();
        winter();
    }
    cout << answer();
    return 0;
}

Review

20922. ๊ฒน์น˜๋Š” ๊ฑด ์‹ซ์–ด

๐Ÿ”— BOJ Link

1005. ACM Craft

๐Ÿ”— BOJ Link

1027. ๊ณ ์ธต ๊ฑด๋ฌผ

๐Ÿ”— BOJ Link

1406. ์—๋””ํ„ฐ

๐Ÿ”— BOJ Link

1459. ๊ฑท๊ธฐ

๐Ÿ”— BOJ Link

1759. ์•”ํ˜ธ ๋งŒ๋“ค๊ธฐ

๐Ÿ”— BOJ Link


11์ฃผ์ฐจ

๋ชฉ์ฐจ

15686. ์น˜ํ‚จ ๋ฐฐ๋‹ฌ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

ํฌ๊ธฐ๊ฐ€ NXN ์ธ ๋„์‹œ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
๋„์‹œ์˜ ๊ฐ ์นธ์€ ๋นˆ ์นธ, ์น˜ํ‚จ์ง‘, ์ง‘ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

์น˜ํ‚จ ๊ฑฐ๋ฆฌ ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•œ๋‹ค.

์ง‘๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์น˜ํ‚จ์ง‘ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ

๋„์‹œ์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•œ๋‹ค.

๋ชจ๋“  ์ง‘์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ ํ•ฉ

0์€ ๋นˆ ์นธ, 1์€ ์ง‘, 2๋Š” ์น˜ํ‚จ์ง‘์ด๋‹ค.

์ž…๋ ฅ์œผ๋กœ๋Š” M์ด ์ฃผ์–ด์ง€๊ณ ,
๋„์‹œ์— ์žˆ๋Š” ์น˜ํ‚จ์ง‘ ์ค‘์—์„œ M๊ฐœ๋ฅผ ๊ณ ๋ฅธ๋’ค ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ ํ์—…์‹œํ‚จ๋‹ค.

์ด๋•Œ, ์–ด๋–ป๊ฒŒ ๊ณจ๋ผ์•ผ ๋„์‹œ์˜ ์น˜ํ‚จ๊ฑฐ๋ฆฌ ๊ฐ€ ๊ฐ€์žฅ ์ž‘๊ฒŒ ๋ ์ง€
๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์ž.

(์˜ˆ์‹œ ์ž…๋ ฅ)
5 3 => N M
0 0 1 0 0 => ๋„์‹œ
0 0 2 0 1
0 1 2 0 0
0 0 1 0 0
0 0 0 0 2

ํ•ด์„ค

1. ์ž…๋ ฅ

์ง‘๊ณผ ์น˜ํ‚จ์ง‘์˜ ์œ„์น˜๋ฅผ ๋ฏธ๋ฆฌ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ ๊ด€๋ฆฌํ•ด์ค€๋‹ค.

int N,M;
struct pos {
    int y; int x;
};
vector<pos> home, chicken;
 
...
 
cin >> N >> M;
for (int i=0; i<N; ++i) {
    for (int j=0; j<N; ++j) {
        int t; cin >> t;
        if (t == 1) home.push_back({i, j});
        else if (t == 2) chicken.push_back({i, j});
    }
}

2. DFS

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฑํŠธ๋ž˜ํ‚นํ•˜๋Š” dfs ๋ชจ์Šต์ด๋‹ค.

dfs ์Šคํƒ๋งˆ๋‹ค ์„ ํƒํ•œ chicken ์„ choose ์— ๋„ฃ์–ด์ค€๋‹ค.
M์œผ๋กœ ๊นŠ์ด๊ฐ€ ๋„๋‹ฌํ•˜๋ฉด cal ์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ
๋„์‹œ์˜ ์น˜ํ‚จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ์œ ์˜ํ•ด์•ผํ•  ๊ฒƒ์€, check ์ธ๋ฐ
์ด๊ฒŒ ์—†์œผ๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๊ฒฐ๊ตญ ์šฐ๋ฆฌ๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ๊ฒƒ์€ ๊ฑฐ๋ฆฌ์ด๋ฉฐ ์กฐํ•ฉ์˜ ๋ฌธ์ œ์ด์ง€
์น˜ํ‚จ์ง‘์ด ์–ด๋Š ์ˆœ์„œ๋กœ ์„ ํƒ๋˜๋Š”์ง€๋Š” ๊ด€์‹ฌ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ check๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๋ฉฐ ํŒจ์Šค์‹œ์ผœ์ค˜์•ผํ•œ๋‹ค.

// main
dfs(0, 0);
 
 
...
 
int ans = INT_MAX;
vector<pos> choose;
bool check[MAX];
 
int dist(const pos& p1, const pos& p2) {
    return abs(p1.y - p2.y) + abs(p1.x - p2.x);
}
 
int cal() {
    int sum = 0;
    for (int i=0; i<home.size(); ++i) {
        int tmp = INT_MAX;
        for (int j=0; j<choose.size(); ++j) {
            tmp = min(tmp, dist(home[i], choose[j]));
        }
        sum += tmp;
    }
    return sum;
}
 
void dfs(int cur, int cnt) {
    if (cnt == M) {
        ans = min(ans, cal());
        return;
    }
 
    for (int i=cur; i<chicken.size(); ++i) {
        if (check[i]) continue;
        choose.push_back(chicken[i]); check[i] = true;
        dfs(i, cnt+1);
        choose.pop_back(); check[i] = false;
    }
}

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <climits>
using namespace std;
#define MAX 13
using pii = pair<int, int>;
struct pos {
    int y; int x;
};
vector<pos> home, chicken;
vector<pos> choose;
 
bool check[MAX];
 
int N,M;
int ans = INT_MAX;
 
int dist(const pos& p1, const pos& p2) {
    return abs(p1.y - p2.y) + abs(p1.x - p2.x);
}
 
int cal() {
    int sum = 0;
    for (int i=0; i<home.size(); ++i) {
        int tmp = INT_MAX;
        for (int j=0; j<choose.size(); ++j) {
            tmp = min(tmp, dist(home[i], choose[j]));
        }
        sum += tmp;
    }
    return sum;
}
 
void dfs(int cur, int cnt) {
    if (cnt == M) {
        ans = min(ans, cal());
        return;
    }
 
    for (int i=cur; i<chicken.size(); ++i) {
        if (check[i]) continue;
        choose.push_back(chicken[i]); check[i] = true;
        dfs(i, cnt+1);
        choose.pop_back(); check[i] = false;
    }
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N >> M;
    for (int i=0; i<N; ++i) {
        for (int j=0; j<N; ++j) {
            int t; cin >> t;
            if (t == 1) home.push_back({i, j});
            else if (t == 2) chicken.push_back({i, j});
        }
    }
    dfs(0, 0);
    cout << ans;
    return 0;
}

11000. ๊ฐ•์˜์‹ค ๋ฐฐ์ •

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

Si ์— ์‹œ์ž‘ํ•ด์„œ Ti ์— ๋๋‚˜๋Š” N ๊ฐœ์˜ ์ˆ˜์—…์ด ์ฃผ์–ด์ง„๋‹ค.
์ตœ์†Œ์˜ ๊ฐ•์˜์‹ค์„ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋“  ์ˆ˜์—…์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ,
๋ช‡ ๊ฐœ์˜ ๊ฐ•์˜์‹ค์ด ํ•„์š”ํ• ์ง€ ์ถœ๋ ฅํ•ด๋ณด์ž.

(์ˆ˜์—…์ด ๋๋‚œ ์งํ›„์— ๋‹ค์Œ ์ˆ˜์—…์„ ๋ฐ”๋กœ ์‹œ์ž‘๊ฐ€๋Šฅํ•˜๋‹ค.)

(์˜ˆ์‹œ ์ž…๋ ฅ)
3 => N
1 3 => S1, T1
2 4
3 5

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

์œ„ 3๊ฐ€์ง€๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

์ˆ˜์—… [์‹œ์ž‘, ๋] ์Œ๋“ค์„ ๋Œ€ํ•˜์—ฌ ๋ชจ๋‘ ์ปจํ…Œ์ด๋„ˆ์— ๋„ฃ์–ด๋‘๊ณ 
์‹œ์ž‘์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค.

๊ฐ€์žฅ ๋จผ์ € ์‹œ์ž‘ํ•˜๋Š” ์ˆ˜์—…์„ ๊ฐ•์˜์‹ค์— ๋„ฃ์–ด๋‘๊ณ  ๋ณด๋Š” ๊ฒƒ.

pq๋Š” intํƒ€์ž…์˜ min heap์œผ๋กœ ๊ด€๋ฆฌํ•  ๊ฒƒ์ด๊ณ , (์ตœ๋Œ€ํ•œ ๋ถ™์—ฌ ๋„ฃ์–ด์•ผ ํ•˜๋‹ˆ๊นŒ)
๋๋‚˜๋Š” ์‹œ๊ฐ„ ์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

์ •๋ ฌ ๋œ ์ˆ˜์—… ์Œ๋“ค์„ ์ˆœํšŒํ•˜๋ฉด์„œ
ํ˜„์žฌ ์ˆ˜์—… ์Œ์˜ ์‹œ์ž‘ ์‹œ๊ฐ„๊ณผ pq์˜ top์— ์žˆ๋Š” ๊ฐ’์„ ๋น„๊ต.

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
using pii = pair<int, int>;
 
int N;
vector<pii> v;
priority_queue<int, vector<int>, greater<int>> pq;
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N;
    int s,t;
    for (int i=0; i<N; ++i) {
        cin >> s >> t;
        v.push_back({s, t});
    }
    // NOTE : ์ˆ˜์—…์˜ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค
    sort(v.begin(), v.end());
 
    // NOTE : ์ฒซ๋ฒˆ์งธ ์ˆ˜์—…์€ ๊ฐ•์˜์‹ค์— ๋„ฃ๊ณ  ์‹œ์ž‘
    pq.push(v[0].second);
 
    for (int i=1; i<N; ++i) {
        int t = pq.top();
        // NOTE : ๋˜‘๊ฐ™์€ ๊ฐ•์˜์‹ค์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค (๋‹ค์Œ ์ˆ˜์—… ์‹œ์ž‘ ์‹œ๊ฐ„ >= ํ˜„์žฌ ์ˆ˜์—… ๋๋‚˜๋Š” ์‹œ๊ฐ„)
        if (v[i].first >= t) pq.pop();
        pq.push(v[i].second);
    }
 
    // NOTE : ํ์—์„œ pop๋˜์ง€ ๋ชปํ•˜๊ณ  ๋‚จ์•„์žˆ๋Š” ๋๋‚˜๋Š” ์‹œ๊ฐ„ ๊ฐœ์ˆ˜๋งŒํผ ๋‹ต์ด๋‹ค
    cout << pq.size();
    return 0;
}

Review

2304. ์ฐฝ๊ณ  ๋‹ค๊ฐํ˜•

๐Ÿ”— BOJ Link

17837. ์ƒˆ๋กœ์šด ๊ฒŒ์ž„ 2

๐Ÿ”— BOJ Link

2156. ํฌ๋„์ฃผ ์‹œ์‹

๐Ÿ”— BOJ Link

1019. ์ฑ… ํŽ˜์ด์ง€

๐Ÿ”— BOJ Link

12100. 2048 (Easy)

๐Ÿ”— BOJ Link

1244. ์Šค์œ„์น˜ ์ผœ๊ณ  ๋„๊ธฐ

๐Ÿ”— BOJ Link


10์ฃผ์ฐจ

๋ชฉ์ฐจ

1890. ์ ํ”„

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

N X N ํฌ๊ธฐ์˜ ๊ฒŒ์ž„ํŒ์ด ์ฃผ์–ด์ง„๋‹ค.

๊ฒŒ์ž„์„ ์ง„ํ–‰ํ•  ๊ฑด๋ฐ,
๋ชฉํ‘œ๋Š” ๊ฐ€์žฅ ์™ผ์ชฝ ์œ„ ์นธ์—์„œ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์นธ์œผ๋กœ
๊ทœ์น™์— ๋งž๊ฒŒ ์ ํ”„๋ฅผ ํ•ด์„œ ๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ ์นธ์—๋Š” ํ˜„์žฌ ์นธ์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ์ ํ˜€์žˆ๋‹ค.
์ด๋™์€ ์˜ค๋ฅธ์ชฝ์ด๋‚˜ ์•„๋ž˜์ชฝ์œผ๋กœ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
ํ•œ ๋ฒˆ ์ ํ”„๋ฅผ ํ•  ๋•Œ, ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ๋ฉด ์•ˆ ๋œ๋‹ค.

0์€ ๋” ์ด์ƒ ์ง„ํ–‰์„ ๋ง‰๋Š” ์ข…์ฐฉ์ ์ด๋‹ค.

๊ทœ์น™์— ๋งž๊ฒŒ ์ด๋™ํ–ˆ์„ ๋•Œ, ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•ด๋ณด์ž.

(์˜ˆ์‹œ ์ž…๋ ฅ)
4 => N
2 3 3 1
1 2 1 3
1 2 3 1
3 1 1 0

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

0,0์—์„œ ์‹œ์ž‘ํ•˜๋Š” dp๊ฐ’์„ 1๋กœ ์„ค์ •.

2์ฐจ์› ๋ฃจํ”„๋ฅผ ๋Œ๋ฉด์„œ
ํ˜„์žฌ ์œ„์น˜์—์„œ ์˜ค๋ฅธ์ชฝ์ด๋‚˜ ์•„๋ž˜์ชฝ์œผ๋กœ ์ด๋™๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด
๋ฏธ๋ž˜์˜ dp๊ฐ’์„ ๋ˆ„์  ๊ฐฑ์‹ ํ•ด์ฃผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
 
#define MAX 100
using ll = long long;
 
int map[MAX][MAX];
ll dp[MAX][MAX];
int N;
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N;
    for (int i=0; i<N; ++i) {
        for (int j=0; j<N; ++j) {
            cin >> map[i][j];
        }
    }
    memset(dp, 0, sizeof(dp));
 
    /** NOTE : ์‹œ์ž‘์ ์˜ dp๊ฐ’์„ 1๋กœ ์„ค์ •ํ•œ๋‹ค */
    dp[0][0] = 1;
    for (int y=0; y<N; ++y) {
        for (int x=0; x<N; ++x) {
            /**
             * NOTE
             * - dp๊ฐ’์ด ๊ฐฑ์‹ ์ด ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ๋กœ์ด๋ฏ€๋กœ ํŒจ์Šคํ•œ๋‹ค
             * - ์ข…์ฐฉ์—ญ์ด๋ฉด ํŒจ์Šคํ•œ๋‹ค
            */
            if (dp[y][x] == 0 || (y == N-1 && x == N-1)) continue;
 
            int d = map[y][x];
            /** NOTE : ๋ฏธ๋ž˜์˜ dp๊ฐ’์„ ๋ˆ„์  ๊ฐฑ์‹  */
            if (y+d < N) dp[y+d][x] += dp[y][x];
            if (x+d < N) dp[y][x+d] += dp[y][x];
        }
    }
 
    cout << dp[N-1][N-1];
    return 0;
}

9466. ํ…€ ํ”„๋กœ์ ํŠธ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

ํ•™์ƒ๋“ค์€ ํ…€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
๊ฐ๊ฐ์˜ ํ•™์ƒ์€ 1๋ถ€ํ„ฐ n๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ€์—ฌ๋œ๋‹ค.

๋ชจ๋“  ํ•™์ƒ๋“ค์€ ํŒ€์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•จ๊ป˜ํ•˜๊ณ  ์‹ถ์€ ํ•™์ƒ์„ ์„ ํƒํ•ด์•ผ ํ•˜๋ฉฐ,
๋‹จ ํ•œ ๋ช…๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๊ธฐ ์ž์‹ ์„ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

ํŒ€์ด ๋˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
ํ•™์ƒ๋“ค์ด(s1, s2, ..., sr)์ด๊ณ  r=1์ธ ๊ฒฝ์šฐ์—

์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ๋ฐ˜์— 7๋ช…์˜ ํ•™์ƒ์ด ์žˆ๊ณ  ์„ ํƒ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๊ณ  ํ•ด๋ณด์ž.

์œ„์˜ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด (3)๊ณผ (4, 7, 6)์ด ํŒ€์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.
1, 2, 5๋Š” ์–ด๋Š ํŒ€์—๋„ ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์„ ํƒ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์„œ,
์–ด๋Š ํŒ€์—๋„ ์†ํ•˜์ง€ ์•Š๋Š” ํ•™์ƒ๋“ค์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์ž.

(์˜ˆ์‹œ ์ž…๋ ฅ)
2 => ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ˆ˜
7 => ํ•™์ƒ ์ˆ˜
3 1 3 7 3 4 6 => ์„ ํƒ ๊ฒฐ๊ณผ
8
1 2 3 4 5 6 7 8

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์™„์ „ํƒ์ƒ‰์„ ํ•˜๋ฉฐ
cycle์„ ๋ชจ๋‘ ์ฐพ์•„๋‚ด๋ ค๊ณ  ํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
์ด๋ฏธ cycle๋กœ ํŒ๋ช…๋œ ํ•™์ƒ๋“ค์— ๋Œ€ํ•ด ๋™์ผํ•œ ์—ฐ์‚ฐ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ.

๊ทธ๋ž˜์„œ ๋ณดํ†ต dfs๋ฅผ ํ• ๋•Œ ์“ฐ๋Š” visited ์— ๋”ํ•ด์„œ
cycle ์ด๋ผ๋Š” ๋ฐฐ์—ด์„ ์ถ”๊ฐ€๋กœ ์„ ์–ธํ•ด์ฃผ์–ด
๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

#include <iostream>
#include <cstring>
#define MAX 100001
using namespace std;
int choice[MAX];
bool visited[MAX];
bool cycle[MAX];
int n;
int cnt;
 
void dfs(int cur) {
    visited[cur] = true;
    int next = choice[cur];
    if (visited[next]) {
        // NOTE : ๋ฐฉ๋ฌธ์ด ๋์Œ์—๋„ cycle๋กœ ๋งˆํ‚น๋˜์ง€ ์•Š์•˜์–ด์•ผ๋งŒ ์‚ฌ์ดํด๋กœ ์นด์šดํŒ…ํ•œ๋‹ค
        if (!cycle[next]) {
            for (int i=next; i!=cur; i=choice[i]) ++cnt;
            ++cnt;
        }
    }
    else dfs(next);
 
    /**
     * NOTE
     * - ์„ ํƒํ•œ ํ•™์ƒ์— ๋Œ€ํ•œ dfs๋ฅผ ๋๋‚ด๊ณ  ๋‚˜์„œ์•ผ cycle ๋งˆํ‚น
     * - ์œ„์—์žˆ๋Š” cnt๋ฅผ ์„ธ๋Š” ๋ถ€๋ถ„์—์„œ flag๋กœ ์‚ฌ์šฉ๋œ๋‹ค
    */
    cycle[cur] = true;
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    int T; cin >> T;
    while (T--) {
        cin >> n;
        cnt = 0;
 
        for (int i=1; i<=n; ++i) {
            cin >> choice[i];
            visited[i] = cycle[i] = false;
        }
 
        for (int i=1; i<=n; ++i) {
            if (!visited[i]) dfs(i);
        } 
        cout << n-cnt << '\n';
    }
    return 0;
}

Review

13335. ํŠธ๋Ÿญ

๐Ÿ”— BOJ Link

16234. ์ธ๊ตฌ ์ด๋™

๐Ÿ”— BOJ Link

11401. ์ดํ•ญ ๊ณ„์ˆ˜ 3

๐Ÿ”— BOJ Link

16967. ๋ฐฐ์—ด ๋ณต์›ํ•˜๊ธฐ

๐Ÿ”— BOJ Link

1522. ๋ฌธ์ž์—ด ๊ตํ™˜

๐Ÿ”— BOJ Link

9527. 1์˜ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ

๐Ÿ”— BOJ Link


9์ฃผ์ฐจ

๋ชฉ์ฐจ

14500. ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

1 X 1์ธ ์ •์‚ฌ๊ฐํ˜•์„ 4๊ฐœ ์ด์–ด์„œ ๋ถ™์ธ ๋„ํ˜•๋“ค ์ค‘
์•„๋ž˜ 5๊ฐœ์˜ ๋„ํ˜•์„ ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๋ผ๊ณ  ํ•œ๋‹ค.

ํฌ๊ธฐ๊ฐ€ N X M ์ธ ์ข…์ด ์œ„์— ํ…ŒํŠธ๋กœ๋ฏธ๋…ธ๋ฅผ ํ•˜๋‚˜ ๋†“๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•˜์ž.
๊ฐ๊ฐ์˜ ์นธ์—๋Š” ์ •์ˆ˜๊ฐ€ ํ•˜๋‚˜์”ฉ ์“ฐ์—ฌ ์žˆ๋‹ค.

์ด๋•Œ, ํ…Œ๋ฅด๋…ธ๋ฏธ๋…ธ ํ•˜๋‚˜๋ฅผ ์ ์ ˆํžˆ ๋†“์•„์„œ
๋†“์ธ ์นธ์— ์žˆ๋Š” ์ˆ˜๋“ค์˜ ํ•ฉ์„ ์ตœ๋Œ€๋กœ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์ž.

ํ…Œ๋ฅด๋…ธ๋ฏธ๋…ธ๋Š” ํšŒ์ „์ด๋‚˜ ๋Œ€์นญ์„ ์‹œ์ผœ๋„ ๋œ๋‹ค.

(์˜ˆ์‹œ ์ž…๋ ฅ)
5 5 => ์„ธ๋กœํฌ๊ธฐ N, ๊ฐ€๋กœํฌ๊ธฐ M
1 2 3 4 5 => ์ข…์ด์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜
5 4 3 2 1
2 3 4 5 6
6 5 4 3 2
1 2 1 2 1

ํ•ด์„ค

DFS + ์™„์ „ํƒ์ƒ‰์˜ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค

๋‹ค๋งŒ, 5๊ฐœ์˜ ํ…Œ๋ฅด๋…ธ๋ฏธ๋…ธ ๋ชจ์–‘ ์ค‘์—์„œ
ใ…œ ๋ชจ์–‘์€ DFS๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ ์ด๊ฒƒ๋งŒ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ.

1. ์ž…๋ ฅ

int N,M;
int map[MAX][MAX];
 
...
 
cin >> N >> M;
for (int i=0; i<N; ++i) {
    for (int j=0; j<M; ++j) {
        cin >> map[i][j];
    }
}

2. main

๋ชจ๋“  ์ง€์ ์— ๋Œ€ํ•ด์„œ dfs๋ฅผ ์ง„ํ–‰ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.
๋˜ํ•œ ๋ชจ๋“  ์ง€์ ์—์„œ ใ…œ ๋ชจ์–‘์„ ๊ฒ€์‚ฌํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

bool visited[MAX][MAX];
int ans = 0;
 
// void dfs(int y, int x, int cnt, int cur);
// void ooh(int y, int x);
 
...
 
for (int i=0; i<N; ++i) {
    for (int j=0; j<M; ++j) {
        visited[i][j] = true;
        dfs(i, j, 1, map[i][j]);
        visited[i][j] = false;
        // ใ…œ
        ooh(i, j);
    }
}
cout << ans;

3. dfs

depth๊ฐ€ 4์ผ๋•Œ ํƒˆ์ถœํ•ด์ฃผ๋Š” ๊ฐ„๋‹จํ•œ dfs์ด๋‹ค.
ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊นŠ์ด์™€ ํ…Œ๋ฅด๋…ธ๋ฏธ๋…ธ ํ•ฉ์„ ์ „๋‹ฌํ•ด์ฃผ๋ฉด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
int ans = 0;
bool visited[MAX][MAX];
 
...
 
bool check(int y, int x) {
    return y>=0 && y<N && x>=0 && x<M;
}
 
void dfs(int y, int x, int cnt, int cur) {
    if (cnt == 4) {
        ans = max(ans, cur);
        return;
    }
 
    for (int i=0; i<4; ++i) {
        int ny = y+dy[i], nx = x+dx[i];
        if (!check(ny, nx) || visited[ny][nx]) continue;
 
        visited[ny][nx] = true;
        dfs(ny, nx, cnt+1, cur+map[ny][nx]);
        visited[ny][nx] = false;
    }
}

4. ใ…œ ๋ชจ์–‘ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์ค‘์‹ฌ์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ๊ฐํ•œ๋‹ค.

๊ฒฝ๊ณ„์— ์œ„์น˜ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด cnt๋กœ ์นด์šดํŒ…์„ ํ•œ๋‹ค.

void ooh(int y, int x) {
    int sum = map[y][x];
    int cnt = 0;
    int tmp = 1001;
    for (int i=0; i<4; ++i) {
        int ny = y+dy[i], nx = x+dx[i];
        if (!check(ny, nx)) continue;
        ++cnt;
        sum += map[ny][nx];
        tmp = min(tmp, map[ny][nx]);
    }
 
    if (cnt < 3) return;
    if (cnt == 3) {
        ans = max(ans, sum);
        return;
    }
 
    // cnt == 4
    ans = max(ans, sum - tmp);
}

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
using namespace std;
#define MAX 500
int N,M;
int map[MAX][MAX];
bool visited[MAX][MAX];
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
int ans = 0;
 
bool check(int y, int x) {
    return y>=0 && y<N && x>=0 && x<M;
}
 
void dfs(int y, int x, int cnt, int cur) {
    if (cnt == 4) {
        ans = max(ans, cur);
        return;
    }
 
    for (int i=0; i<4; ++i) {
        int ny = y+dy[i], nx = x+dx[i];
        if (!check(ny, nx) || visited[ny][nx]) continue;
 
        visited[ny][nx] = true;
        dfs(ny, nx, cnt+1, cur+map[ny][nx]);
        visited[ny][nx] = false;
    }
}
 
void ooh(int y, int x) {
    int sum = map[y][x];
    int cnt = 0;
    int tmp = 1001;
    for (int i=0; i<4; ++i) {
        int ny = y+dy[i], nx = x+dx[i];
        if (!check(ny, nx)) continue;
        ++cnt;
        sum += map[ny][nx];
        tmp = min(tmp, map[ny][nx]);
    }
 
    if (cnt < 3) return;
    if (cnt == 3) {
        ans = max(ans, sum);
        return;
    }
 
    // cnt == 4
    ans = max(ans, sum - tmp);
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N >> M;
    for (int i=0; i<N; ++i) {
        for (int j=0; j<M; ++j) {
            cin >> map[i][j];
        }
    }
 
    for (int i=0; i<N; ++i) {
        for (int j=0; j<M; ++j) {
            visited[i][j] = true;
            dfs(i, j, 1, map[i][j]);
            visited[i][j] = false;
            // ใ…œ
            ooh(i, j);
        }
    }
    cout << ans;
    return 0;
}

1992. ์ฟผ๋“œํŠธ๋ฆฌ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

ํ‘๋ฐฑ์˜์ƒ์„ ์••์ถ•ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ฟผ๋“œํŠธ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์˜์ƒ์„ ์••์ถ•ํ•œ๋‹ค.

์••์ถ•ํ•  ๋•Œ๋Š” ์™ผ์ชฝ ์œ„, ์˜ค๋ฅธ์ชฝ ์œ„, ์™ผ์ชฝ ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๋กœ
์˜์—ญ์„ ๋‚˜๋ˆ„๊ณ  ์••์ถ•ํ•˜๊ฒŒ ๋œ๋‹ค.

์ž…๋ ฅ์€ ์˜์ƒ์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” N์ด ์ฃผ์–ด์ง€๋ฉฐ,
ํ•ญ์ƒ 2์˜ ์ œ๊ณฑ์ˆ˜๋กœ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ 0๊ณผ 1๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด๋“ค์ด ์ฃผ์–ด์ง„๋‹ค.

์ด๋•Œ ์˜์ƒ์„ ์••์ถ•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์ž.

(์˜ˆ์‹œ ์ž…๋ ฅ)
8
11110000
11110000
00011100
00011100
11110000
11110000
11110011
11110011

(์˜ˆ์‹œ ์ถœ๋ ฅ)
((110(0101))(0010)1(0001))

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

์žฌ๊ท€์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ์€ ์ž๋ช…ํ•ด๋ณด์ด๋‚˜,
๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ dfs๋ฅผ ์ฒ˜์Œ์— ๋ฆฌํ„ดํƒ€์ž…์„ string์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐ”๋žŒ์—
string์ฒ˜๋ฆฌ๊ฐ€ ๊นŒ๋‹ค๋กœ์›Œ ํ—ค๋ฉจ๋‹ค.

ํ•ต์‹ฌ์€ ๋ฆฌํ„ด ํƒ€์ž…์„ void๋กœ ์„ค์ •ํ•˜๊ณ ,
์••์ถ•๊ฒฐ๊ณผ ์ž์ฒด๋ฅผ ๋งค๋ฒˆ ์ „๋‹ฌํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ
๊ทธ๋ƒฅ ๋ฐ”๋กœ ์ถœ๋ ฅํ•ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

#include <iostream>
#include <string>
using namespace std;
#define MAX 64
int N;
char map[MAX][MAX];
 
void dfs(int y, int x, int len) {
    // NOTE : ๊ธธ์ด๊ฐ€ 1์ด๋ฉด ์••์ถ• ๋ถˆ๊ฐ€๋Šฅ
    if (len == 1) {
        cout << map[y][x];
        return;
    }
 
    bool flag = true;
    char c = map[y][x];
    // NOTE : ๋ชจ๋“  dfs ๊นŠ์ด๋งˆ๋‹ค ์••์ถ• ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค
    for (int i=y; i<y+len; ++i) {
        for (int j=x; j<x+len; ++j) {
            if (c != map[i][j]) {
                flag = false;
                break;
            }
        }
        if (!flag) break;
    }
 
    // NOTE : ์••์ถ• ๊ฐ€๋Šฅํ–ˆ๋‹ค๋ฉด...
    if (flag) {
        cout << c;
        return;
    }
 
    // NOTE : ์™ผ์ชฝ ์œ„, ์˜ค๋ฅธ์ชฝ ์œ„, ์™ผ์ชฝ ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์ˆœ์„œ
    cout << "(";
    dfs(y, x, len/2);
    dfs(y, x+len/2, len/2);
    dfs(y+len/2, x, len/2);
    dfs(y+len/2, x+len/2, len/2);
    cout << ")";
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N;
    for (int i=0; i<N; ++i) {
        for (int j=0; j<N; ++j) {
            cin >> map[i][j];
        }
    }
 
    dfs(0, 0, N);
    return 0;
}

Review

16918. ๋ด„๋ฒ„๋งจ

๐Ÿ”— BOJ Link

4991. ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ

๐Ÿ”— BOJ Link

2217. ๋กœํ”„

๐Ÿ”— BOJ Link

1113. ์ˆ˜์˜์žฅ ๋งŒ๋“ค๊ธฐ

๐Ÿ”— BOJ Link

19238. ์Šคํƒ€ํŠธ ํƒ์‹œ

๐Ÿ”— BOJ Link

17615. ๋ณผ ๋ชจ์œผ๊ธฐ

๐Ÿ”— BOJ Link


8์ฃผ์ฐจ

๋ชฉ์ฐจ

13460. ๊ตฌ์Šฌ ํƒˆ์ถœ 2

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

์„ธ๋กœ ํฌ๊ธฐ N, ๊ฐ€๋กœ ํฌ๊ธฐ M์˜ ๋ณด๋“œ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
๋ณด๋“œ์—๋Š” ๊ตฌ๋ฉ์ด ํ•˜๋‚˜ ์žˆ๋‹ค.

๊ตฌ์Šฌ ํƒˆ์ถœ์€ ์ด๋Ÿฐ ๋ณด๋“œ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ,
ํŒŒ๋ž€ ๊ตฌ์Šฌ, ๋นจ๊ฐ„ ๊ตฌ์Šฌ์„ ํ•˜๋‚˜์”ฉ ๋„ฃ์€ ๋’ค ๋นจ๊ฐ„ ๊ตฌ์Šฌ์„ ๊ตฌ๋ฉ์„ ํ†ตํ•ด ๋นผ๋‚ด๋Š” ๊ฒŒ์ž„.
(๋‹จ, ํŒŒ๋ž€ ๊ตฌ์Šฌ์ด ๊ตฌ๋ฉ์— ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋œ๋‹ค.)

๊ตฌ์Šฌ์€ ์ค‘๋ ฅ์„ ์ด์šฉํ•ด์„œ ์ด๋ฆฌ ์ €๋ฆฌ ๊ตด๋ ค์•ผ ํ•˜๋ฉฐ
์ƒํ•˜์ขŒ์šฐ๋กœ ๊ธฐ์šธ์ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค

๋นจ๊ฐ„ ๊ตฌ์Šฌ๊ณผ ํŒŒ๋ž€ ๊ตฌ์Šฌ์€ ํ•œ ์นธ์— ์žˆ์„ ์ˆ˜ ์—†๊ณ ,
๋นจ๊ฐ„ ๊ตฌ์Šฌ์ด ๊ตฌ๋ฉ์— ๋น ์ง€๋ฉด ์„ฑ๊ณต์ด์ง€๋งŒ,
ํŒŒ๋ž€ ๊ตฌ์Šฌ์ด ๊ตฌ๋ฉ์— ๋น ์ง€๋ฉด ์‹คํŒจ์ด๋‹ค.

๋ณด๋“œ์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ,
์ตœ์†Œ ๋ช‡ ๋ฒˆ ๋งŒ์— ๋นจ๊ฐ„ ๊ตฌ์Šฌ์„ ๊ตฌ๋ฉ์„ ํ†ตํ•ด
๋นผ๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์ž.

๋งŒ์•ฝ, 10๋ฒˆ ์ดํ•˜๋กœ ์›€์ง์—ฌ์„œ
๋นจ๊ฐ„ ๊ตฌ์Šฌ์„ ๊ตฌ๋ฉ์„ ํ†ตํ•ด ๋นผ๋‚ผ ์ˆ˜ ์—†์œผ๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์‹œ์ž…๋ ฅ

<!-- R : ๋นจ๊ฐ„ ๊ตฌ์Šฌ, B : ํŒŒ๋ž€ ๊ตฌ์Šฌ, . : ๋นˆ์นธ, # : ๋ฒฝ, O : ๊ตฌ๋ฉ -->
 
5 5     => N, M
#####   => ๋ณด๋“œ
#..B#
#.#.#
#RO.#
#####

ํ•ด์„ค

DFS ๋ฅผ ์ด์šฉํ•œ ์™„์ „ํƒ์ƒ‰ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค.

1. ์ž…๋ ฅ

#define MAX 10
struct pos {
    int y; int x;
};
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
 
int N, M;
char board[MAX][MAX];
int ans = INT_MAX;
 
...
 
// main
cin >> N >> M;
pos r,b;
 
for (int i=0; i<N; ++i) {
    for (int j=0; j<M; ++j) {
        cin >> board[i][j];
        if (board[i][j] == 'R') r = {i, j};
        else if (board[i][j] == 'B') b = {i, j};
    }
}

์ขŒํ‘œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ pos ๊ตฌ์กฐ์ฒด๋ฅผ ์„ ์–ธํ•ด์ค€๋‹ค.

๋นจ๊ฐ„๊ตฌ์Šฌ, ํŒŒ๋ž€๊ตฌ์Šฌ์„ ์ž…๋ ฅ๋ฐ›๋Š” ์‹œ์ ์— ๋ฏธ๋ฆฌ ๊ธฐ๋กํ•ด๋‘๋ฉฐ,
์ด๋ฅผ r , b ์— ์ €์žฅํ•œ๋‹ค.

1.5 DFS ์ง„์ž…์ „ main

// DFS ์‹œ๊ทธ๋‹ˆ์ฒ˜
void dfs(pos red, pos blue, int cnt, int dir);
 
// main
for (int i=0; i<4; ++i) {
    dfs(r, b, 1, i);
}
 
if (ans == INT_MAX || ans > 10) ans = -1;
cout << ans;

4๋ฐฉํ–ฅ์œผ๋กœ ๊ธฐ์šธ์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 4๊ฐ€์ง€ dfs ์ง„์ž…๋ฐฉ์‹์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ main์—์„œ ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ dfs ์ฝœ์€ 4๋ฒˆ์„ ํ•ด์ค€๋‹ค.

DFS ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ

์„ ์ „๋‹ฌํ•œ๋‹ค.

์ถœ๋ ฅ์€ DFS๋ฅผ ํ†ตํ•ด ans๋ฅผ ๊ฐฑ์‹ ํ•œ๋’ค main์œผ๋กœ ๋Œ์•„์™€
ans๊ฐ€ INT_MAX ์—์„œ ๋ณ€ํ•˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜
10์„ ์ดˆ๊ณผํ•œ๋‹ค๋ฉด -1์„ ์ถœ๋ ฅํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ์ด๋‹ค.

2. DFS

ํ•ต์‹ฌ์€

์œ„ ๋‚ด์šฉ๋“ค์„ ์ง€ํ‚ค๋ฉฐ ์™„์ „ํƒ์ƒ‰์„ ํ•ด์ฃผ๋Š”๊ฒŒ ์ค‘์š”ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

int count(int cy, int ncy, int cx, int ncx) {
    return abs(cy-ncy) + abs(cx-ncx);
}
 
int inverse(int dir) {
    int inv;
    switch (dir)
    {
    case 0:
        inv = 1;
        break;
    case 1:
        inv = 0;
        break;
    case 2:
        inv = 3;
        break;
    case 3:
        inv = 2;
        break;
    }
    return inv;
}
 
void dfs(pos red, pos blue, int cnt, int dir) {
    if (cnt > 10 || cnt >= ans) return;
 
    // NOTE : ๋นจ๊ฐ„ ๊ตฌ์Šฌ์ด ํƒˆ์ถœํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค
    int nry = red.y, nrx = red.x;
    bool red_out = false;
    while (1) {
        nry += dy[dir]; nrx += dx[dir];
        if (board[nry][nrx] == '#') break;
        if (board[nry][nrx] == 'O') {
            red_out = true;
            break;
        }
    }
    // NOTE : # or O => . ์œ„์น˜๋กœ ํ•œ์นธ ๋ณด์ •
    nry -= dy[dir]; nrx -= dx[dir];
 
    // NOTE : ํŒŒ๋ž€ ๊ตฌ์Šฌ์ด ํƒˆ์ถœํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค
    int nby = blue.y, nbx = blue.x;
    while (1) {
        nby += dy[dir]; nbx += dx[dir];
        if (board[nby][nbx] == '#') break;
        // NOTE : ํŒŒ๋ž€ ๊ตฌ์Šฌ์ด ํƒˆ์ถœ ํ–ˆ๋‹ค๋ฉด ๋ฐ”๋กœ ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•œ๋‹ค
        if (board[nby][nbx] == 'O') {
            return;
        }
    }
    // NOTE : # or O => . ์œ„์น˜๋กœ ํ•œ์นธ ๋ณด์ •
    nby -= dy[dir]; nbx -= dx[dir];
 
    // NOTE : ๋นจ๊ฐ„ ๊ตฌ์Šฌ์ด ํƒˆ์ถœํ–ˆ๋‹ค๋ฉด ans๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค
    if (red_out) {
        ans = min(ans, cnt);
        return;
    }
 
    /**
     * NOTE
     * - ๋นจ๊ฐ„ / ํŒŒ๋ž€ ๊ตฌ์Šฌ์€ ๊ฐ™์€ ์นธ์— ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค
     * - ํ•˜์ง€๋งŒ ๋นจ/ํŒŒ ๊ตฌ์Šฌ์— ๋Œ€ํ•ด ๊ฐ๊ฐ while์„ ๋Œ๋ฆฌ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ฐ’์ด ๊ฐ™์•„์ง€๋Š” ์ƒํ™ฉ์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค
     * - ๋”ฐ๋ผ์„œ ๊ฐ’์ด ๊ฐ™์•˜์„ ๊ฒฝ์šฐ ์ด๋™ํ•œ ๊ฑฐ๋ฆฌ๊ฐ€ ํฐ ์ชฝ์„ ํ•œ์นธ ๋ณด์ •ํ•ด์ค€๋‹ค
    */
    if ((nry == nby) && (nrx == nbx)) {
        int rd = count(red.y, nry, red.x, nrx);
        int bd = count(blue.y, nby, blue.x, nbx);
 
        // NOTE : ๊ธฐ์šธ์˜€์„ ๋•Œ ๋” ๋งŽ์ด ์›€์ง์˜€๋‹ค๋ฉด ํ•œ์นธ ๋˜๋Œ๋ ค ์ค˜์•ผ ํ•œ๋‹ค
        if (rd > bd) { nry -= dy[dir]; nrx -= dx[dir]; }
        else { nby -= dy[dir]; nbx -= dx[dir]; }
    }
 
    for (int i=0; i<4; ++i) {
        // NOTE : ์ด์ „ ๋ฑกํ–ฅ๊ณผ ๋˜‘๊ฐ™์€ ๋ฐฉํ–ฅ or ๋ฐ˜๋Œ€๋ฐฉํ–ฅ (๋˜๋Œ์•„๊ฐ€๋Š”) ์€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค
        if (i == dir || i == inverse(dir)) continue;
 
        pos nr = {nry, nrx}, nb = {nby, nbx};
        dfs(nr, nb, cnt+1, i);
    }
}

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <queue>
#include <vector>
#include <climits>
using namespace std;
 
#define MAX 10
struct pos {
    int y; int x;
};
int dy[] = {-1, 1, 0, 0};
int dx[] = {0, 0, -1, 1};
 
int N, M;
char board[MAX][MAX];
int ans = INT_MAX;
 
int count(int cy, int ncy, int cx, int ncx) {
    return abs(cy-ncy) + abs(cx-ncx);
}
 
int inverse(int dir) {
    int inv;
    switch (dir)
    {
    case 0:
        inv = 1;
        break;
    case 1:
        inv = 0;
        break;
    case 2:
        inv = 3;
        break;
    case 3:
        inv = 2;
        break;
    }
    return inv;
}
 
void dfs(pos red, pos blue, int cnt, int dir) {
    if (cnt > 10 || cnt >= ans) return;
 
    // NOTE : ๋นจ๊ฐ„ ๊ตฌ์Šฌ์ด ํƒˆ์ถœํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค
    int nry = red.y, nrx = red.x;
    bool red_out = false;
    while (1) {
        nry += dy[dir]; nrx += dx[dir];
        if (board[nry][nrx] == '#') break;
        if (board[nry][nrx] == 'O') {
            red_out = true;
            break;
        }
    }
    // NOTE : # or O => . ์œ„์น˜๋กœ ํ•œ์นธ ๋ณด์ •
    nry -= dy[dir]; nrx -= dx[dir];
 
    // NOTE : ํŒŒ๋ž€ ๊ตฌ์Šฌ์ด ํƒˆ์ถœํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค
    int nby = blue.y, nbx = blue.x;
    while (1) {
        nby += dy[dir]; nbx += dx[dir];
        if (board[nby][nbx] == '#') break;
        // NOTE : ํŒŒ๋ž€ ๊ตฌ์Šฌ์ด ํƒˆ์ถœ ํ–ˆ๋‹ค๋ฉด ๋ฐ”๋กœ ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•œ๋‹ค
        if (board[nby][nbx] == 'O') {
            return;
        }
    }
    // NOTE : # or O => . ์œ„์น˜๋กœ ํ•œ์นธ ๋ณด์ •
    nby -= dy[dir]; nbx -= dx[dir];
 
    // NOTE : ๋นจ๊ฐ„ ๊ตฌ์Šฌ์ด ํƒˆ์ถœํ–ˆ๋‹ค๋ฉด ans๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค
    if (red_out) {
        ans = min(ans, cnt);
        return;
    }
 
    /**
     * NOTE
     * - ๋นจ๊ฐ„ / ํŒŒ๋ž€ ๊ตฌ์Šฌ์€ ๊ฐ™์€ ์นธ์— ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค
     * - ํ•˜์ง€๋งŒ ๋นจ/ํŒŒ ๊ตฌ์Šฌ์— ๋Œ€ํ•ด ๊ฐ๊ฐ while์„ ๋Œ๋ฆฌ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ฐ’์ด ๊ฐ™์•„์ง€๋Š” ์ƒํ™ฉ์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค
     * - ๋”ฐ๋ผ์„œ ๊ฐ’์ด ๊ฐ™์•˜์„ ๊ฒฝ์šฐ ์ด๋™ํ•œ ๊ฑฐ๋ฆฌ๊ฐ€ ํฐ ์ชฝ์„ ํ•œ์นธ ๋ณด์ •ํ•ด์ค€๋‹ค
    */
    if ((nry == nby) && (nrx == nbx)) {
        int rd = count(red.y, nry, red.x, nrx);
        int bd = count(blue.y, nby, blue.x, nbx);
 
        // NOTE : ๊ธฐ์šธ์˜€์„ ๋•Œ ๋” ๋งŽ์ด ์›€์ง์˜€๋‹ค๋ฉด ํ•œ์นธ ๋˜๋Œ๋ ค ์ค˜์•ผ ํ•œ๋‹ค
        if (rd > bd) { nry -= dy[dir]; nrx -= dx[dir]; }
        else { nby -= dy[dir]; nbx -= dx[dir]; }
    }
 
    for (int i=0; i<4; ++i) {
        // NOTE : ์ด์ „ ๋ฑกํ–ฅ๊ณผ ๋˜‘๊ฐ™์€ ๋ฐฉํ–ฅ or ๋ฐ˜๋Œ€๋ฐฉํ–ฅ (๋˜๋Œ์•„๊ฐ€๋Š”) ์€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค
        if (i == dir || i == inverse(dir)) continue;
 
        pos nr = {nry, nrx}, nb = {nby, nbx};
        dfs(nr, nb, cnt+1, i);
    }
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N >> M;
    pos r,b;
 
    for (int i=0; i<N; ++i) {
        for (int j=0; j<M; ++j) {
            cin >> board[i][j];
            if (board[i][j] == 'R') r = {i, j};
            else if (board[i][j] == 'B') b = {i, j};
        }
    }
 
    for (int i=0; i<4; ++i) {
        dfs(r, b, 1, i);
    }
 
    if (ans == INT_MAX || ans > 10) ans = -1;
    cout << ans;
    return 0;
}

17143. ๋‚š์‹œ์™•

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

ํ–‰์ด R๊ฐœ, ์—ด์ด C๊ฐœ์ธ ๊ฒฉ์žํŒ์ด ์žˆ๋‹ค.
๊ฐ ์นธ์—๋Š” ์ƒ์–ด๊ฐ€ ์ตœ๋Œ€ ํ•œ ๋งˆ๋ฆฌ ๋“ค์–ด์žˆ์„ ์ˆ˜ ์žˆ๊ณ , ํฌ๊ธฐ ๋ฐ ์†๋„๋ฅผ ์ง€๋‹Œ๋‹ค.

๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋‚š์‹œ์™•์€ ์ฒ˜์Œ 1๋ฒˆ ์—ด์˜ ํ•œ ์นธ ์™ผ์ชฝ์— ์œ„์น˜ํ•ด ์žˆ๋‹ค.
๋‚š์‹œ์™•์ด ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์—ด์˜ ์˜ค๋ฅธ์ชฝ ๋๊นŒ์ง€ ์ด๋™ํ•˜๋ฉด ๊ฒŒ์ž„์ด ๋๋‚œ๋‹ค.

๋‚š์‹œ์™•์€ 1์ดˆ์— ํ•œ ์นธ์”ฉ ์ด๋™ํ•˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ ์ผ์–ด๋‚œ๋‹ค.

์ƒ์–ด๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์†๋„๋กœ ์ด๋™ํ•˜๊ณ , ๋‹จ์œ„๋Š” ์นธ/์ดˆ ์ด๋‹ค.
๋งŒ์•ฝ ์ด๋™ํ•˜๋ ค๋Š” ์นธ์ด ๊ฒฉ์žํŒ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜๋Š” ๊ฒฝ์šฐ์—๋Š”
๋ฐฉํ–ฅ์„ ๋ฐ˜๋Œ€๋กœ ๋ฐ”๊ฟ”์„œ ์ด๋™ํ•œ๋‹ค.

์ƒ์–ด๊ฐ€ ์ด๋™์„ ๋งˆ์นœ ํ›„์— ํ•œ ์นธ์— ์ƒ์–ด๊ฐ€ ๋‘ ๋งˆ๋ฆฌ ์ด์ƒ ์กด์žฌ ๊ฐ€๋Šฅํ•˜๋ฉฐ,
์ด ๊ฒฝ์šฐ ํฌ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ํฐ ์ƒ์–ด๋งŒ์ด ์‚ด์•„๋‚จ๋Š”๋‹ค.

๊ฒฉ์žํŒ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋‚š์‹œ์™•์ด ์žก์€ ์ƒ์–ด ํฌ๊ธฐ์˜ ํ•ฉ์„ ๊ตฌํ•ด๋ณด์ž.

์˜ˆ์‹œ์ž…๋ ฅ
4 6 8 => R C M(์ƒ์–ด์˜ ์ˆ˜)
4 1 3 3 8 => r c s d z (r,c : ์ƒ์–ด์˜ ์œ„์น˜, s : ์†๋„, d : ์ด๋™๋ฐฉํ–ฅ, z : ํฌ๊ธฐ)
1 3 5 2 9
2 4 8 4 1
4 5 0 1 4
3 3 1 2 7
1 5 8 4 3
3 6 2 1 2
2 2 2 3 5

ํ•ด์„ค

0. ์„œ๋ก 

๋‚š์‹œ์™•์ด ๋‚š์‹œํ•˜๋Š” ํ๋ฆ„์„ ๋‹ค์‹œ ์ƒ๊ธฐํ•ด๋ณด๋ฉด

์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๋Œ€์‘์‹œ์ผœ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

int fisher = 1;
 
...
 
// main
for (; fisher<=C; ++fisher) {
    if (is_over()) break;
    fish();
    move();
    eat();
}

fisher ๊ฐ€ C ๋ฅผ ๋„˜์–ด๊ฐ€๊ธฐ ์ „๊นŒ์ง€ ์ด๋ฅผ ๋ฐ˜๋ณตํ•ด์ฃผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

is_over ๋ฅผ ํ†ตํ•ด ์ƒ์–ด๋ฅผ ๋ชจ๋‘ ์žก์•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

1. ์ž…๋ ฅ

#define MAX 101
struct shark {
    int id;
    int y; int x;
    int speed;
    int dir;
    int size;
    bool is_dead;
};
int R,C,M;
vector<shark> sharks;
vector<int> map[MAX][MAX];
 
...
 
// main
cin >> R >> C >> M;
int r,c,speed,dir,size;
for (int i=0; i<M; ++i) {
    cin >> r >> c >> speed >> dir >> size;
    sharks.push_back({i, r, c, speed, dir, size, false});
    map[r][c].push_back(i);
}

์ฃผ๋ชฉํ•ด์•ผํ•  ์ง€์ ๋“ค์ด ์กด์žฌํ•œ๋‹ค.

์ฒซ๋ฒˆ์งธ๋Š”, shark๋กœ ํ•˜์—ฌ๊ธˆ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” id ๋ฅผ ๊ฐ€์ง€๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋‘๋ฒˆ์งธ๋Š”, shark๊ฐ€ ์ด๋™ ํ›„์— ์„œ๋กœ ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ,
map ์— vector(์ปจํ…Œ์ด๋„ˆ) ํƒ€์ž… ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
shark์˜ id๋ฅผ ํ†ตํ•ด ์œ ์—ฐํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, shark์—๊ฒŒ is_dead ๋ผ๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ฐ€์ง€๊ฒŒ ํ•ด์„œ
์ง์ ‘ shark๋ฅผ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ญ์ œํ•˜๋Š” ์—ฐ์‚ฐ์„ ํ•˜์ง€ ์•Š๋Š” ์ ์ด๋‹ค.

2. fish : ์ƒ์–ด ํฌํš

int ans = 0;
 
void fish() {
    // NOTE : ๋‚š์‹œ๊พผ์€ ์ง€๋ฉด๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณณ๋ถ€ํ„ฐ ๋‚š์‹œ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค
    for (int i=1; i<=R; ++i) {
        // NOTE : shark id๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋‹ค
        if (!map[i][fisher].empty()) {
            int shark_id = map[i][fisher][0]; 
            ans += sharks[shark_id].size;
 
            // NOTE : ํฌํšํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃฝ์—ˆ๋‹ค๊ณ  ํ‘œ๊ธฐํ•˜๊ณ  ํ•ด๋‹น ์œ„์น˜์˜ map์€ ๋น„์›Œ์ค€๋‹ค
            sharks[shark_id].is_dead = true;
            map[i][fisher].clear();
            break;
        }
    }
}

shark ์ž์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ , id๋งŒ์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๋Š” ๋•๋ถ„์—
fish์˜ ๊ณผ์ •์ด ์‰ฌ์›Œ์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

3. move : ์ƒ์–ด ์ด๋™

// NOTE : <dummy>, UP, DOWN, RIGHT, LEFT
int dy[] = {-9, -1, 1, 0, 0};
int dx[] = {-9, 0, 0, 1, -1};
 
int inverse_dir(int dir) {
    if (dir == 1) return 2;
    else if (dir == 2) return 1;
    else if (dir == 3) return 4;
    else return 3;
}
 
void move() {
    for (const auto& shark : sharks) {
        // NOTE : ํฌํš๋œ ์ƒ์–ด๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค
        if (shark.is_dead) continue;
 
        int y = shark.y, x = shark.x;
 
        // NOTE : ์ด์ œ ์ด๋™ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ์œ„์น˜์˜ shark id ์ปจํ…Œ์ด๋„ˆ๋Š” ๋น„์›Œ์ค€๋‹ค
        map[y][x].clear();
    }
 
    for (auto& shark : sharks) {
        // NOTE : ์ฃฝ์€ ์ƒ์–ด๋Š” ์ด๋™์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค
        if (shark.is_dead) continue;
 
        int y = shark.y, x = shark.x, dir = shark.dir, speed = shark.speed;
        int ny = y, nx = x;
 
        // NOTE : ์ด๋™ ๋ฐฉํ–ฅ์ด UP or DOWN
        if (dir == 1 || dir == 2) {
            /**
             * NOTE
             * - ์ด๋™ ๋ฐฉํ–ฅ์ด ์œ„์•„๋ž˜๋‹ˆ๊นŒ R์ด ๊ธฐ์ค€์ด๋‹ค
             * - ๊ธฐ์กด ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•˜๋ฉฐ, ์›๋ž˜์˜ ์œ„์น˜๋กœ ๋Œ์•„์˜ค๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ฃผ๊ธฐ๋Š” 2 * (R-1)์ด๋‹ค
            */
            int period = 2 * (R-1);
            if (speed >= period) speed %= period;
 
            for (int i=0; i<speed; ++i) {
                // NOTE : ์ผ๋‹จ ๊ฐฑ์‹ ์„ ํ•˜๊ณ , ์œ„์น˜ ๋ณด์ •์„ ํ•œ๋‹ค
                ny += dy[dir]; nx += dx[dir];
                if (ny < 1) {
                    ny += 2;
                    dir = inverse_dir(dir);
                }
                else if (ny > R) {
                    ny -= 2;
                    dir = inverse_dir(dir);
                }
            }
        }
        // NOTE : ์ด๋™ ๋ฐฉํ–ฅ์ด RIGHT or LEFT
        else {
            /**
             * NOTE
             * - ์ด๋™ ๋ฐฉํ–ฅ์ด ์œ„์•„๋ž˜๋‹ˆ๊นŒ C๊ฐ€ ๊ธฐ์ค€์ด๋‹ค
             * - ๊ธฐ์กด ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•˜๋ฉฐ, ์›๋ž˜์˜ ์œ„์น˜๋กœ ๋Œ์•„์˜ค๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ฃผ๊ธฐ๋Š” 2 * (C-1)์ด๋‹ค
            */
            int period = 2 * (C-1);
            if (speed >= period) speed %= period;
 
            for (int i=0; i<speed; ++i) {
                // NOTE : ์ผ๋‹จ ๊ฐฑ์‹ ์„ ํ•˜๊ณ , ์œ„์น˜ ๋ณด์ •์„ ํ•œ๋‹ค
                ny += dy[dir]; nx += dx[dir];
                if (nx < 1) {
                    nx += 2;
                    dir = inverse_dir(dir);
                }
                else if (nx > C) {
                    nx -= 2;
                    dir = inverse_dir(dir);
                }
            }
        }
 
        // NOTE : ์ƒˆ๋กญ๊ฒŒ ๊ฐฑ์‹ ํ•œ ์ขŒํ‘œ ์ž๋ฆฌ์— shark id๋ฅผ ๋„ฃ์–ด์ค€๋‹ค
        shark.y = ny;
        shark.x = nx;
        shark.dir = dir;
        map[ny][nx].push_back(shark.id);
    }
}

๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ง€์ ์€

ํ˜„์žฌ ์ƒ์–ด๊ฐ€ ์ž์‹ ์˜ ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•˜๋ฉฐ ์›๋ž˜ ์œ„์น˜๋กœ ๋Œ์•„์˜ค๋Š” ์ฃผ๊ธฐ๊ฐ€
์œ„์™€ ๊ฐ™์ด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

4. eat : ์ƒ์–ด๋ผ๋ฆฌ ํฌ์‹

// NOTE : size ๊ธฐ์ค€์œผ๋กœ shark id๋ฅผ ๋‚ด๋ฆผ ์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค
bool cmp(int a, int b) {
    return sharks[a].size > sharks[b].size;
}
 
void eat() {
    for (int i=1; i<=R; ++i) {
        for (int j=1; j<=C; ++j) {
            if (map[i][j].size() > 1) {
                sort(map[i][j].begin(), map[i][j].end(), cmp);
 
                // NOTE : ๊ฐ€์žฅ size๊ฐ€ ํฐ shark์˜ id
                int max_size_shark_id = map[i][j][0];
 
                // NOTE : ๋‹ค๋ฅธ ์ƒ์–ด๋“ค์€ ๊ฐ€์žฅ ํฐ ์ƒ์–ด์—๊ฒŒ ๋ชจ๋‘ ์žก์•„๋จนํžŒ๋‹ค (is_dead = true)
                for (int k=1; k<map[i][j].size(); ++k) {
                    int shark_id = map[i][j][k];
                    sharks[shark_id].is_dead = true;
                }
 
                // NOTE : ๋ชจ๋‘ ๋น„์›Œ์ฃผ๊ณ  ๊ฐ€์žฅ size๊ฐ€ ํฐ ์ƒ์–ด๋งŒ ๋‚จ๊ธด๋‹ค
                map[i][j].clear();
                map[i][j].push_back(max_size_shark_id);
            }
        }
    }
}

id ๋ฅผ ํ†ตํ•ด์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—
์žก์•„๋จน๋Š” ๊ณผ์ • ๋˜ํ•œ ๊ตฌํ˜„ํ•˜๊ธฐ ํŽธ๋ฆฌํ•˜๋‹ค.

5. is_over : ์ƒ์–ด๋ฅผ ๋ชจ๋‘ ์žก์•˜๋Š”์ง€

bool is_over() {
    for (const auto& shark : sharks) {
        if (!shark.is_dead) return false;
    }
    return true;
}

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
#define MAX 101
struct shark {
    int id;
    int y; int x;
    int speed;
    int dir;
    int size;
    bool is_dead;
};
// NOTE : <dummy>, UP, DOWN, RIGHT, LEFT
int dy[] = {-9, -1, 1, 0, 0};
int dx[] = {-9, 0, 0, 1, -1};
 
int R,C,M;
vector<shark> sharks;
vector<int> map[MAX][MAX];
int fisher = 1;
int ans = 0;
 
bool is_over() {
    for (const auto& shark : sharks) {
        if (!shark.is_dead) return false;
    }
    return true;
}
 
void fish() {
    // NOTE : ๋‚š์‹œ๊พผ์€ ์ง€๋ฉด๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ณณ๋ถ€ํ„ฐ ๋‚š์‹œ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค
    for (int i=1; i<=R; ++i) {
        // NOTE : shark id๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ์œ„์น˜๋ฅผ ์ฐพ๋Š”๋‹ค
        if (!map[i][fisher].empty()) {
            int shark_id = map[i][fisher][0]; 
            ans += sharks[shark_id].size;
 
            // NOTE : ํฌํšํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃฝ์—ˆ๋‹ค๊ณ  ํ‘œ๊ธฐํ•˜๊ณ  ํ•ด๋‹น ์œ„์น˜์˜ map์€ ๋น„์›Œ์ค€๋‹ค
            sharks[shark_id].is_dead = true;
            map[i][fisher].clear();
            break;
        }
    }
}
 
int inverse_dir(int dir) {
    if (dir == 1) return 2;
    else if (dir == 2) return 1;
    else if (dir == 3) return 4;
    else return 3;
}
 
void move() {
    for (const auto& shark : sharks) {
        // NOTE : ํฌํš๋œ ์ƒ์–ด๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค
        if (shark.is_dead) continue;
 
        int y = shark.y, x = shark.x;
 
        // NOTE : ์ด์ œ ์ด๋™ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ์œ„์น˜์˜ shark id ์ปจํ…Œ์ด๋„ˆ๋Š” ๋น„์›Œ์ค€๋‹ค
        map[y][x].clear();
    }
 
    for (auto& shark : sharks) {
        // NOTE : ์ฃฝ์€ ์ƒ์–ด๋Š” ์ด๋™์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค
        if (shark.is_dead) continue;
 
        int y = shark.y, x = shark.x, dir = shark.dir, speed = shark.speed;
        int ny = y, nx = x;
 
        // NOTE : ์ด๋™ ๋ฐฉํ–ฅ์ด UP or DOWN
        if (dir == 1 || dir == 2) {
            /**
             * NOTE
             * - ์ด๋™ ๋ฐฉํ–ฅ์ด ์œ„์•„๋ž˜๋‹ˆ๊นŒ R์ด ๊ธฐ์ค€์ด๋‹ค
             * - ๊ธฐ์กด ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•˜๋ฉฐ, ์›๋ž˜์˜ ์œ„์น˜๋กœ ๋Œ์•„์˜ค๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ฃผ๊ธฐ๋Š” 2 * (R-1)์ด๋‹ค
            */
            int period = 2 * (R-1);
            if (speed >= period) speed %= period;
 
            for (int i=0; i<speed; ++i) {
                // NOTE : ์ผ๋‹จ ๊ฐฑ์‹ ์„ ํ•˜๊ณ , ์œ„์น˜ ๋ณด์ •์„ ํ•œ๋‹ค
                ny += dy[dir]; nx += dx[dir];
                if (ny < 1) {
                    ny += 2;
                    dir = inverse_dir(dir);
                }
                else if (ny > R) {
                    ny -= 2;
                    dir = inverse_dir(dir);
                }
            }
        }
        // NOTE : ์ด๋™ ๋ฐฉํ–ฅ์ด RIGHT or LEFT
        else {
            /**
             * NOTE
             * - ์ด๋™ ๋ฐฉํ–ฅ์ด ์œ„์•„๋ž˜๋‹ˆ๊นŒ C๊ฐ€ ๊ธฐ์ค€์ด๋‹ค
             * - ๊ธฐ์กด ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•˜๋ฉฐ, ์›๋ž˜์˜ ์œ„์น˜๋กœ ๋Œ์•„์˜ค๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ฃผ๊ธฐ๋Š” 2 * (C-1)์ด๋‹ค
            */
            int period = 2 * (C-1);
            if (speed >= period) speed %= period;
 
            for (int i=0; i<speed; ++i) {
                // NOTE : ์ผ๋‹จ ๊ฐฑ์‹ ์„ ํ•˜๊ณ , ์œ„์น˜ ๋ณด์ •์„ ํ•œ๋‹ค
                ny += dy[dir]; nx += dx[dir];
                if (nx < 1) {
                    nx += 2;
                    dir = inverse_dir(dir);
                }
                else if (nx > C) {
                    nx -= 2;
                    dir = inverse_dir(dir);
                }
            }
        }
 
        // NOTE : ์ƒˆ๋กญ๊ฒŒ ๊ฐฑ์‹ ํ•œ ์ขŒํ‘œ ์ž๋ฆฌ์— shark id๋ฅผ ๋„ฃ์–ด์ค€๋‹ค
        shark.y = ny;
        shark.x = nx;
        shark.dir = dir;
        map[ny][nx].push_back(shark.id);
    }
}
 
// NOTE : size ๊ธฐ์ค€์œผ๋กœ shark id๋ฅผ ๋‚ด๋ฆผ ์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค
bool cmp(int a, int b) {
    return sharks[a].size > sharks[b].size;
}
 
void eat() {
    for (int i=1; i<=R; ++i) {
        for (int j=1; j<=C; ++j) {
            if (map[i][j].size() > 1) {
                sort(map[i][j].begin(), map[i][j].end(), cmp);
 
                // NOTE : ๊ฐ€์žฅ size๊ฐ€ ํฐ shark์˜ id
                int max_size_shark_id = map[i][j][0];
 
                // NOTE : ๋‹ค๋ฅธ ์ƒ์–ด๋“ค์€ ๊ฐ€์žฅ ํฐ ์ƒ์–ด์—๊ฒŒ ๋ชจ๋‘ ์žก์•„๋จนํžŒ๋‹ค (is_dead = true)
                for (int k=1; k<map[i][j].size(); ++k) {
                    int shark_id = map[i][j][k];
                    sharks[shark_id].is_dead = true;
                }
 
                // NOTE : ๋ชจ๋‘ ๋น„์›Œ์ฃผ๊ณ  ๊ฐ€์žฅ size๊ฐ€ ํฐ ์ƒ์–ด๋งŒ ๋‚จ๊ธด๋‹ค
                map[i][j].clear();
                map[i][j].push_back(max_size_shark_id);
            }
        }
    }
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> R >> C >> M;
    int r,c,speed,dir,size;
    for (int i=0; i<M; ++i) {
        cin >> r >> c >> speed >> dir >> size;
        sharks.push_back({i, r, c, speed, dir, size, false});
        map[r][c].push_back(i);
    }
 
    for (; fisher<=C; ++fisher) {
        if (is_over()) break;
        fish();
        move();
        eat();
    }
    cout << ans;
    return 0;
}

Review

10844. ์‰ฌ์šด ๊ณ„๋‹จ ์ˆ˜

๐Ÿ”— BOJ Link

15684. ์‚ฌ๋‹ค๋ฆฌ ์กฐ์ž‘

๐Ÿ”— BOJ Link

19941. ํ–„๋ฒ„๊ฑฐ ๋ถ„๋ฐฐ

๐Ÿ”— BOJ Link

1976. ์—ฌํ–‰ ๊ฐ€์ž

๐Ÿ”— BOJ Link

14889. ์Šคํƒ€ํŠธ์™€ ๋งํฌ

๐Ÿ”— BOJ Link

2206. ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ

๐Ÿ”— BOJ Link


7์ฃผ์ฐจ : Dijkstra

๋ชฉ์ฐจ

1916. ์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

N๊ฐœ์˜ ๋„์‹œ, M๊ฐœ์˜ ๋ฒ„์Šค๊ฐ€ ์žˆ๋‹ค.
์ž…๋ ฅ์œผ๋กœ ๋ฒ„์Šค์˜ ์ถœ๋ฐœ์ง€์™€ ๋„์ฐฉ์ง€ ์‚ฌ์ด์˜ ๋น„์šฉ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
์ด๋•Œ ์ฃผ์–ด์ง„ ์ถœ๋ฐœ์ง€ -> ๋„์ฐฉ์ง€๋กœ ๊ฐ€๋Š” ์ตœ์†Œ๋น„์šฉ์„ ๊ตฌํ•ด๋ณด์ž.

์˜ˆ์‹œ์ž…๋ ฅ : 1๋ฒˆ ๋„์‹œ์—์„œ 5๋ฒˆ ๋„์‹œ๋กœ ๊ฐ€๋Š” ์ตœ์†Œ๋น„์šฉ์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค

5 => ๋„์‹œ์˜ ์ˆ˜ N
8 => ๋ฒ„์Šค์˜ ์ˆ˜ M
1 2 2 => 1๋ฒˆ ๋„์‹œ์—์„œ 2๋ฒˆ ๋„์‹œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ : 2
1 3 3
1 4 1
1 5 10
2 4 2
3 4 1
3 5 1
4 5 3
1 5 => ์ถœ๋ฐœ์ง€ : 1๋ฒˆ, ๋„์ฐฉ์ง€ : 5๋ฒˆ

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

์šฐ์„ ์ˆœ์œ„ ํ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋‹ค์ต์ŠคํŠธ๋ผ ๋ฌธ์ œ์ด๋‹ค.
๋ฌด๋‚œํ•˜๊ฒŒ ์ง„ํ–‰๋˜๋Š” ๋ฌธ์ œ๋ผ ์ฃผ์„์œผ๋กœ ๋Œ€์ฒดํ•˜๊ฒ ๋‹ค.

#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
#define MAX 1001
#define INF 99999999
struct info {
    int idx; int w;
};
// NOTE : ๋น„์šฉ์ด ์ž‘์€ ๊ฒƒ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„ ์ˆœ์œ„ ํ์— ์‚ฌ์šฉ๋˜๋Š” comparator
struct cmp {
    bool operator()(const info& a, const info& b) {
        return a.w > b.w;
    }
};
int N,M;
vector<info> map[MAX];
int dist[MAX];
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    int u,v,w; int start, dest;
    cin >> N >> M;
    for (int i=0; i<M; ++i) {
        cin >> u >> v >> w;
        map[u].push_back({v, w});
    }
    cin >> start >> dest;
 
    // NOTE : ๊ฐ ๋„์‹œ์— ๋„๋‹ฌํ•˜๋Š” ๋น„์šฉ์„ INF๋กœ ์ดˆ๊ธฐํ™”
    for (int i=1; i<=N; ++i) dist[i] = INF;
    priority_queue<info, vector<info>, cmp> pq;
    pq.push({start, 0});
 
    // NOTE : ์‹œ์ž‘ ๋„์‹œ์˜ ๋น„์šฉ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
    dist[start] = 0;
 
    while (!pq.empty()) {
        auto p = pq.top(); pq.pop();
        int cur = p.idx, w = p.w;
 
        // NOTE : ํ•ด๋‹น ๋„์‹œ์— ๋„๋‹ฌํ•˜๋Š” ๋น„์šฉ์ด w๋ณด๋‹ค ์ด๋ฏธ ๋” ์ž‘๋‹ค๋ฉด ์Šคํ‚ตํ•œ๋‹ค
        if (dist[cur] < w) continue;
 
        for (int i=0; i<map[cur].size(); ++i) {
            int next = map[cur][i].idx, nw = map[cur][i].w;
 
            // NOTE : ๋‹ค์ต์Šค๋ฅด๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ์„œ ๊ฐฑ์‹ 
            if (dist[next] > nw+w) {
                dist[next] = nw+w;
 
                // NOTE : ์šฐ์„ ์ˆœ์œ„ ํ ๋•๋ถ„์— ํ•ญ์ƒ dist๊ฐ€ ์ž‘์€ ๊ฒƒ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ๋œ๋‹ค
                pq.push({next, dist[next]});
            }
        }
    }
    cout << dist[dest];
    return 0;
}

1753. ์ตœ๋‹จ๊ฒฝ๋กœ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

๋ฐฉํ–ฅ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ,
์ฃผ์–ด์ง„ ์‹œ์ž‘์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ์œผ๋กœ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด๋ณด์ž.

์˜ˆ์‹œ์ž…๋ ฅ

5 6 => ์ •์ ์˜ ์ˆ˜ V, ๊ฐ„์„ ์˜ ์ˆ˜ E
1 => ์‹œ์ž‘์  K
5 1 1 => u, v, w : u์—์„œ v๋กœ ๊ฐ€๋Š” ๊ฐ€์ค‘์น˜ w
1 2 2
1 3 3
2 3 4
2 4 5
3 4 6

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

1916. ์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ ์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ๋ฌธ์ œ์ด๋‹ค.
๋‹ค๋งŒ ์ด๋ฒˆ์—๋Š” ์‹œ์ž‘์ ๊ณผ ๋„์ฐฉ์ ์ด ์ •ํ•ด์ง€์ง€ ์•Š๊ณ 
์‹œ์ž‘์ ์—์„œ ๋ชจ๋“  ์ •์ ์œผ๋กœ์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค.

๋ฌด๋‚œํ•˜๊ฒŒ ์ง„ํ–‰๋˜๋Š” ๋ฌธ์ œ๋ผ ์ฃผ์„์œผ๋กœ ๋Œ€์ฒดํ•˜๊ฒ ๋‹ค.

#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
#define MAX 20001
#define INF 9999999
int V, E, K;
struct info {
    int idx; int w;
};
// NOTE : ๋น„์šฉ์ด ์ž‘์€ ๊ฒƒ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„ ์ˆœ์œ„ ํ์— ์‚ฌ์šฉ๋˜๋Š” comparator
struct cmp {
    bool operator()(const info& a, const info& b) {
        return a.w > b.w;
    }
};
vector<info> map[MAX];
int dist[MAX];
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> V >> E >> K;
    int u,v,w;
    for (int i=0; i<E; ++i) {
        cin >> u >> v >> w;
        map[u].push_back({v, w});
    }
 
    // NOTE : ๊ฐ ๋„์‹œ์— ๋„๋‹ฌํ•˜๋Š” ๋น„์šฉ์„ INF๋กœ ์ดˆ๊ธฐํ™”
    for (int i=1; i<=V; ++i) dist[i] = INF;
    
    priority_queue<info, vector<info>, cmp> min_pq;
    min_pq.push({K, 0});
 
    // NOTE : ์‹œ์ž‘ ๋„์‹œ K์˜ ๋น„์šฉ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
    dist[K] = 0;
 
    while (!min_pq.empty()) {
        auto p = min_pq.top(); min_pq.pop();
        int cur = p.idx, w = p.w;
 
        // NOTE : ํ•ด๋‹น ๋„์‹œ์— ๋„๋‹ฌํ•˜๋Š” ๋น„์šฉ์ด w๋ณด๋‹ค ์ด๋ฏธ ๋” ์ž‘๋‹ค๋ฉด ์Šคํ‚ตํ•œ๋‹ค
        if (dist[cur] < w) continue;
 
        for (int i=0; i<map[cur].size(); ++i) {
            int next = map[cur][i].idx, nw = map[cur][i].w;
 
            // NOTE : ๋‹ค์ต์Šค๋ฅด๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ์„œ ๊ฐฑ์‹ 
            if (dist[next] > w + nw) {
                dist[next] = w + nw;
                // NOTE : ์šฐ์„ ์ˆœ์œ„ ํ ๋•๋ถ„์— ํ•ญ์ƒ dist๊ฐ€ ์ž‘์€ ๊ฒƒ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ๋œ๋‹ค
                min_pq.push({next, dist[next]});
            }
        }
    }
 
    // NOTE : ๊ฐ dist๋ฅผ ์กฐ์‚ฌํ•ด์„œ INF์ธ์ง€ ์•„๋‹Œ์ง€๋งŒ ํŒ๋‹จํ•˜๋ฉด ๋œ๋‹ค
    for (int i=1; i<=V; ++i) {
        if (dist[i] == INF) cout << "INF\n";
        else cout << dist[i] << '\n';
    }
 
    return 0;
}

Review

1238. ํŒŒํ‹ฐ

๐Ÿ”— BOJ Link

18352. ํŠน์ • ๊ฑฐ๋ฆฌ์˜ ๋„์‹œ ์ฐพ๊ธฐ

๐Ÿ”— BOJ Link

1446. ์ง€๋ฆ„๊ธธ

๐Ÿ”— BOJ Link

10282. ํ•ดํ‚น

๐Ÿ”— BOJ Link

5972. ํƒ๋ฐฐ ๋ฐฐ์†ก

๐Ÿ”— BOJ Link

1445. ์ผ์š”์ผ ์•„์นจ์˜ ๋ฐ์ดํŠธ

๐Ÿ”— BOJ Link


6์ฃผ์ฐจ : Implementation

๋ชฉ์ฐจ

5430. AC

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

๋ฌธ์ œ์˜ ๋ชฉํ‘œ๋Š” ์–ด๋–ค ์ •์ˆ˜๋ฐฐ์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ
์ฃผ์–ด์ง„ ๋ช…๋ น์–ด์— ๋”ฐ๋ผ์„œ ๋ฐฐ์—ด์„ ๋ณ€ํ˜•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ•จ์ˆ˜ P์˜ ์ข…๋ฅ˜์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, RDD๋Š” ๋ฐฐ์—ด์„ ๋’ค์ง‘๊ณ  ๋’ค๋ถ€ํ„ฐ ์ˆซ์ž๋ฅผ 2๋ฒˆ ๋ฒ„๋ฆฌ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ์‹œ ์ž…๋ ฅ
4 => ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T
RDD => T1์˜ ํ•จ์ˆ˜ P
4 => T1์˜ ๋ฐฐ์—ด์— ๋“ค์–ด์žˆ๋Š” ์ˆ˜์˜ ๊ฐœ์ˆ˜ n
[1,2,3,4] => T1์˜ ๋ฐฐ์—ด์— ๋“ค์–ด์žˆ๋Š” ์ˆ˜
DD => T2์˜ ํ•จ์ˆ˜ P
1 => T2์˜ ๋ฐฐ์—ด์— ๋“ค์–ด์žˆ๋Š” ์ˆ˜์˜ ๊ฐœ์ˆ˜ n
[42] => T2์˜ ๋ฐฐ์—ด์— ๋“ค์–ด์žˆ๋Š” ์ˆ˜
RRD => T3์˜ ํ•จ์ˆ˜ P
...

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” ์ˆ˜ํ–‰ํ•  ํ•จ์ˆ˜ P๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๋‹ค์Œ ์ค„์—๋Š” ๋ฐฐ์—ด์— ๋“ค์–ด์žˆ๋Š” ์ˆ˜์˜ ๊ฐœ์ˆ˜ n์ด ์ฃผ์–ด์ง€๊ณ ,
๊ทธ ๋‹ค์Œ ์ค„์—๋Š” [x1,...,xn] ํ˜•ํƒœ๋กœ ๋ฐฐ์—ด์— ๋“ค์–ด์žˆ๋Š” ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด, ์ •์ˆ˜๋ฐฐ์—ด์— ํ•จ์ˆ˜ P๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์ž.

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

๊ทธ๋ƒฅ ๋ฐ€๊ณ  ๋‚˜๊ฐ€๋ฉด ๋˜๋Š” ๋ฌธ์ œ๋ผ ์ฃผ์„์œผ๋กœ ๋Œ€์ฒดํ•˜๊ฒ ๋‹ค.
ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” deque ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

#include <iostream>
#include <string>
#include <deque>
using namespace std;
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    int T; cin >> T;
    while (T--) {
        string p, num; int n;
        cin >> p; cin >> n; cin >> num;
        string t = "";
        deque<int> dq;
 
        for (int i=0; i<num.length(); ++i) {
            /**
             * ์ˆซ์ž๋งŒ ๋ฝ‘์•„๋‚ด์„œ t์— ๋‹ด๋Š”๋‹ค
             */            
            if (num[i] == '[' || num[i] == ']') continue;
            if (num[i] == ',') {
                dq.push_back(stoi(t));
                t.clear();
            }
            else t += num[i];
        }
 
        /**
         * i๊ฐ€ length๋ณด๋‹ค ์ปค์ ธ์„œ ํƒˆ์ถœํ•œ ๊ฑฐ๋ผ, ๋งˆ์ง€๋ง‰ ์ˆซ์ž๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ์ž‘์—…์„ ํ•ด์ค˜์•ผํ•œ๋‹ค
         */
        if (!t.empty()) dq.push_back(stoi(t));
        
 
        /**
         * - R์„ ๋งŒ๋‚˜๋ฉด ๋’ค์ง‘์–ด์ฃผ๊ณ , D๋ฅผ ๋งŒ๋‚˜๋ฉด ์•ž์—์„œ๋ถ€ํ„ฐ ๋นผ์ค€๋‹ค
         *
         * - ๋’ค์ง‘๋Š” ๊ฒƒ์€ is_front๋ฅผ ํ†ตํ•ด ๊ตฌ๋ถ„ํ•˜๊ณ ,
         * D๋ฅผ ๋งŒ๋‚˜๋ฉด is_front์— ๋”ฐ๋ผ์„œ pop_front, pop_back์„ ํ•ด์ค€๋‹ค
         *
         * - deque๊ฐ€ ๋น„์–ด์žˆ๋Š”๋ฐ D๋ฅผ ๋งŒ๋‚˜๋ฉด ์—๋Ÿฌ๋ฅผ ์ถœ๋ ฅํ•ด์•ผํ•˜๊ณ ,
         * ์ด๋ฅผ ์œ„ํ•ด err ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
         */
        bool is_front = true;
        bool err = false;
        for (int i=0; i<p.length(); ++i) {
            if (p[i] == 'R') {
                is_front = !is_front;
            }
            else {
                if (dq.empty()) {
                    err = true;
                    break;
                }
                if (is_front) dq.pop_front();
                else dq.pop_back();
            }
        }
        
        
        /**
         * - ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์œผ๋ฉด error ์ถœ๋ ฅ
         *
         * - ์•„๋‹ˆ๋ผ๋ฉด, is_front์— ๋”ฐ๋ผ์„œ ์ ์ ˆํžˆ
         * pop_front, pop_back์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค
         */
        if (err) {
            cout << "error" << '\n';
        }
        else {
            string ans = "[";
            if (is_front) {
                while (!dq.empty()) {
                    int x = dq.front();
                    ans += to_string(x) + ",";
                    dq.pop_front();
                }
            }
            else {
                while (!dq.empty()) {
                    int x = dq.back();
                    ans += to_string(x) + ",";
                    dq.pop_back();
                }
            }
            
            
            /**
             * ์ž…๋ ฅ ์ž์ฒด๊ฐ€ [] <- ๋นˆ๋ฐฐ์—ด๋กœ ๋“ค์–ด์˜ค๋ฉด
             * ํ˜„์žฌ ans๋Š” "[" ์ธ ์ƒํƒœ๋ผ์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค
             */
            if (ans[ans.length()-1] == ',') ans[ans.length()-1] = ']';
            else ans += ']';
            cout << ans << '\n';
        }
    }
    return 0;
}

4673. ์…€ํ”„ ๋„˜๋ฒ„

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์ž.

d(n) := n๊ณผ n์˜ ๊ฐ ์ž๋ฆฌ์ˆ˜๋ฅผ ๋”ํ•˜๋Š” ํ•จ์ˆ˜
์˜ˆ์‹œ: d(75) = 75 + 7 + 5 = 87

์ด๋•Œ, n์„ d(n)์˜ ์ƒ์„ฑ์ž ๋ผ๊ณ  ํ•œ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์—†๋Š” ์ˆซ์ž๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค.
100๋ณด๋‹ค ์ž‘์€ ์…€ํ”„ ๋„˜๋ฒ„์—๋Š”
1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97์ด ์žˆ๋‹ค.

10,000 ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์…€ํ”„ ๋„˜๋ฒ„๋ฅผ ๋ชจ๋‘ ์ฐพ์•„ ์ถœ๋ ฅํ•ด๋ณด์ž.

ํ•ด์„ค & ์ „์ฒด ์ฝ”๋“œ

์ด ๋ฌธ์ œ ์—ญ์‹œ ๊ทธ๋ƒฅ ๋ฐ€๊ณ  ๋‚˜๊ฐ€๋ฉด ๋˜๋Š” ๋ฌธ์ œ๋ผ ์ฃผ์„์œผ๋กœ ๋Œ€์ฒดํ•˜๊ฒ ๋‹ค.

์•„์ด๋””์–ด๋Š” 1 ~ 10,000๊นŒ์ง€ ๋ฏธ๋ฆฌ ์ˆœํšŒ๋ฅผ ํ•ด์„œ
๋ฏธ๋ฆฌ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋Š” ์ˆซ์ž๋“ค์„ ์ฒดํฌํ•ด๋†“๋Š”๊ฒŒ ์ „๋ถ€์ด๋‹ค.

#include <iostream>
using namespace std;
bool filter[10001];
 
int dn(int n) {
    int sum = 0; int temp = n;
    while (temp) {
        sum += temp%10;
        temp /= 10;
    }
    return sum + n;
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    for (int i=1; i<=10000; ++i) {
        /**
         * ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋Š” ์ˆซ์ž๋“ค์„ ์ฒดํฌํ•ด๋†“๋Š”๋‹ค
         * ๊ฐ„๋‹จํ•˜๊ฒŒ dn(i) ์ธ๋ฑ์Šค๋ฅผ true๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค
         */
        if (dn(i) > 10000) continue;
        filter[dn(i)] = true;
    }
 
    /**
     * filter๊ฐ€ false์ธ ์ˆซ์ž๋“ค์„ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค
     * ๊ทธ๊ฒŒ ๊ณง ์…€ํ”„๋„˜๋ฒ„์ด๋‹ค
     */
    for (int i=1; i<=10000; ++i) {
        if (filter[i]) continue;
        cout << i << '\n';
    }
    return 0;
}

Review

3019. ํ…ŒํŠธ๋ฆฌ์Šค

๐Ÿ”— BOJ Link

16236. ์•„๊ธฐ ์ƒ์–ด

๐Ÿ”— BOJ Link

17413. ๋‹จ์–ด ๋’ค์ง‘๊ธฐ 2

๐Ÿ”— BOJ Link

15683. ๊ฐ์‹œ

๐Ÿ”— BOJ Link

1966. ํ”„๋ฆฐํ„ฐ ํ

๐Ÿ”— BOJ Link

2239. ์Šค๋„์ฟ 

๐Ÿ”— BOJ Link


5์ฃผ์ฐจ : DP

๋ชฉ์ฐจ

2098. ์™ธํŒ์› ์ˆœํšŒ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋Š” ๋„์‹œ๋“ค์ด ์žˆ๋‹ค.
์ด๋•Œ, ํ•œ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•ด N๊ฐœ์˜ ๋„์‹œ๋ฅผ ๊ฑฐ์ณ ๋‹ค์‹œ ์›๋ž˜ ๋„์‹œ๋กœ ๋Œ์•„์˜ค๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ.

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ฒฝ๋กœ๋“ค ์ค‘์—์„œ ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์„ ๋“ค์ด๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„๋ณด์ž.

์ž…๋ ฅ์œผ๋กœ W[i][j] ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

W[i][j] : i๋ฒˆ ๋„์‹œ์—์„œ j๋ฒˆ ๋„์‹œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ

ํ•ญ์ƒ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

(์˜ˆ์‹œ์ž…๋ ฅ)
4 => ๋„์‹œ์˜ ์ˆ˜ N
0 10 15 20 => W[0][0] ~ W[0][3]
5 0 9 10
6 13 0 12
8 8 9 0

ํ•ด์„ค

์œ„ ์•„์ด๋””์–ด๋“ค๋กœ ํ•ด๊ฒฐ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

dp๋ฅผ ์œ„ํ•ด 2์ฐจ์› ๋ฐฐ์—ด์„ ์ด์šฉํ•  ๊ฑด๋ฐ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

dp[a][b] : b๋ผ๋Š” ์ƒํƒœ๋กœ a๋ฅผ ๋ฐฉ๋ฌธํ•œ ์ƒํ™ฉ์ผ๋•Œ ๋น„์šฉ์˜ ์ตœ์†Ÿ๊ฐ’

b๋ผ๋Š” ์ƒํƒœ ๋Š” ๋ฐฉ๋ฌธํ•œ ๋„์‹œ๋“ค์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ
์ด๋ฅผ ์œ„ํ•ด Bitmask๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

1. ์ž…๋ ฅ๋ฐ›๊ธฐ

#define MAX 16
int N;
int w[MAX][MAX];
 
...
 
cin >> N;
for (int i=0; i<N; ++i) {
    for (int j=0; j<N; ++j) {
        cin >> w[i][j];
    }
}

2. DFS ์ง„์ž…์ „ main

// int dfs(int cur, int visited);
cout << dfs(0, 1 << 0);

dfs๋ฅผ ์–ด๋””์„œ ์‹œ์ž‘ํ•˜๋“  ๊ฒฐ๊ตญ์—๋Š” ๋ชจ๋“  ๋„์‹œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๋Š”๊ฒŒ ๋ชฉํ‘œ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์‹œ์ž‘์ ์€ ์–ด๋””๋กœ ์žก๋‚˜ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•จ์ด ๋ณด์žฅ๋˜๊ณ 
ํŽธ์˜์ƒ 0๋ฒˆ ๋„์‹œ์—์„œ ์‹œ์ž‘ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

Bitmask๋ฅผ ํ†ตํ•ด ๋ฐฉ๋ฌธ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—,
0๋ฒˆ ๋„์‹œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๋กœ
1์„ 0์นธ left shiftํ•œ ๊ฐ’์„ 2๋ฒˆ์งธ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ์—ˆ๋‹ค.


3. DFS

#define UPPER_BOUND 9999999
int dp[MAX][1 << MAX];
 
...
 
bool is_visited(int visited, int city) {
    return visited & (1 << city);
}
 
int make_visited(int visited, int city) {
    return visited | (1 << city);
}
 
int dfs(int cur, int visited) {
    if (visited == (1 << N) - 1) {
        if (w[cur][0] == 0) return UPPER_BOUND;
        return w[cur][0];
    }
 
    if (dp[cur][visited] != 0) return dp[cur][visited];
 
    dp[cur][visited] = UPPER_BOUND;
    for (int next=0; next<N; ++next) {
        if (is_visited(visited, next) || w[cur][next] == 0) continue;
        dp[cur][visited] = min(
            dp[cur][visited],
            w[cur][next] + dfs(next, make_visited(visited, next)
        ));
    }
    return dp[cur][visited];
}
3-a) Bitmask ๊ด€๋ จ ํ•จ์ˆ˜
bool is_visited(int visited, int city) {
    return visited & (1 << city);
}
 
int make_visited(int visited, int city) {
    return visited | (1 << city);
}

๋น„ํŠธ๋งˆ์Šคํ‚น์„ ์‚ฌ์šฉํ•ด

ํ•˜๊ฒŒ๋” ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์ด๋‹ค.

3-b) DFS
#define UPPER_BOUND 9999999
int dp[MAX][1 << MAX];

ํ•ด์„ค์— ๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ์„œ dp์— ๋Œ€ํ•œ ์ •์˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ–ˆ์—ˆ๋‹ค.

dp[a][b] : b๋ผ๋Š” ์ƒํƒœ๋กœ a๋ฅผ ๋ฐฉ๋ฌธํ•œ ์ƒํ™ฉ์ผ๋•Œ ๋น„์šฉ์˜ ์ตœ์†Ÿ๊ฐ’

๋ฌธ์ œ์กฐ๊ฑด์—์„œ ๋„์‹œ N์€ 16๊ฐœ ์ดํ•˜์ธ ์ƒํ™ฉ์ด๋‹ค.
๋”ฐ๋ผ์„œ ๋ชจ๋“  ๋„์‹œ์˜ ๋ฐฉ๋ฌธ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” 16๊ฐœ์˜ ๋น„ํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

1 << 16 - 1
 
  1000 0000 0000 0000 0
-                     1
-----------------------
    1111 1111 1111 1111

๋ฐฐ์—ด์€ ๋”ฑ 1์„ ๋บ€๋งŒํผ๋งŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ
๋ชฉํ‘œ์ธ ๋„์‹œ์˜ ์ธ๋ฑ์Šค 0 ~ 15๋ฅผ ๋ชจ๋‘ ํ‘œํ˜„๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.
์ด๊ฒƒ์ด dp์˜ 2๋ฒˆ์งธ ์ฐจ์› ํฌ๊ธฐ์— ๋Œ€ํ•ด 1์„ MAX๋งŒํผ left shiftํ•œ ์ด์œ ์ด๋‹ค.

UPPER_BOUND ๋Š” ๋ฌธ์ œ๋ฅผ ํ†ต๊ณผ์‹œํ‚ค๋Š” ์„ ์—์„œ ์ถฉ๋ถ„ํžˆ ํฐ ๊ฐ’์œผ๋กœ ์žก์•˜๋‹ค.
dp๋ฅผ ๊ฐฑ์‹ ํ• ๋•Œ min์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋‹ˆ ์ด์—๋Œ€ํ•œ placeholder ์—ญํ• ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

3-c) DFS
int dfs(int cur, int visited) {
    // 1. ๋ชจ๋“  ๋„์‹œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด
    if (visited == (1 << N) - 1) {
        if (w[cur][0] == 0) return UPPER_BOUND;
        return w[cur][0];
    }
    
    // 2. ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์ƒํƒœ๋ผ๋ฉด
    if (dp[cur][visited] != 0) return dp[cur][visited];
 
    // 3. ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•œ ์ดˆ๊ธฐํ™”
    dp[cur][visited] = UPPER_BOUND;
    for (int next=0; next<N; ++next) {
        // 4. ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋„์‹œ๋Š” ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์—†๊ณ , ๊ฐˆ ์ˆ˜ ์—†๋Š” ๋„์‹œ๋„ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์—†๋‹ค
        if (is_visited(visited, next) || w[cur][next] == 0) continue;
 
        // 5. ์ตœ์†Ÿ๊ฐ’ ๊ฐฑ์‹ 
        dp[cur][visited] = min(
            dp[cur][visited],
            w[cur][next] + dfs(next, make_visited(visited, next)
        ));
    }
    return dp[cur][visited];
}

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <cstring>
using namespace std;
#define MAX 16
#define UPPER_BOUND 9999999
int w[MAX][MAX];
int dp[MAX][1 << MAX];
int N;
 
bool is_visited(int visited, int city) {
    return visited & (1 << city);
}
 
int make_visited(int visited, int city) {
    return visited | (1 << city);
}
 
int dfs(int cur, int visited) {
    if (visited == (1 << N) - 1) {
        if (w[cur][0] == 0) return UPPER_BOUND;
        return w[cur][0];
    }
 
    if (dp[cur][visited] != 0) return dp[cur][visited];
 
    dp[cur][visited] = UPPER_BOUND;
    for (int next=0; next<N; ++next) {
        if (is_visited(visited, next) || w[cur][next] == 0) continue;
        dp[cur][visited] = min(dp[cur][visited], w[cur][next] + dfs(next, make_visited(visited, next)));
    }
    return dp[cur][visited];
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N;
    for (int i=0; i<N; ++i) {
        for (int j=0; j<N; ++j) {
            cin >> w[i][j];
        }
    }
    cout << dfs(0, 1 << 0);
    return 0;
}

1149. RGB๊ฑฐ๋ฆฌ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

1๋ฒˆ ์ง‘๋ถ€ํ„ฐ N๋ฒˆ ์ง‘๊นŒ์ง€ N๊ฐœ์˜ ์ง‘์ด ์ฃผ์–ด์ง„๋‹ค.

์ง‘์„ R, G, B ์ค‘ ํ•˜๋‚˜์˜ ์ƒ‰์œผ๋กœ ์น ํ•ด์•ผ ํ•œ๋‹ค. ์„œ๋กœ ์ด์›ƒํ•˜๋Š” ์ง‘์€ ๊ฐ™์€ ์ƒ‰์œผ๋กœ ์น ํ•  ์ˆ˜ ์—†๋‹ค.

๊ฐ ์ง‘์„ ์น ํ•˜๋Š” ๋น„์šฉ์ด R, G, B ๋ณ„๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ชจ๋“  ์ง‘์„ ์น ํ•˜๋Š” ๋น„์šฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•ด๋ณด์ž.

(์˜ˆ์‹œ์ž…๋ ฅ)
3 => ์ง‘์˜ ์ˆ˜ N
26 40 83 => 1๋ฒˆ ์ง‘์˜ R, G, B ์ƒ‰์น  ๋น„์šฉ
49 60 57
13 89 99

ํ•ด์„ค

0. ์•„์ด๋””์–ด

dp๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

dp[a][b] : b๋ผ๋Š” ์ƒ‰์œผ๋กœ a๋ฒˆ์งธ ์ง‘์„ ์น ํ•˜๋Š” ๋น„์šฉ์˜ ์ตœ์†Ÿ๊ฐ’

์ฆ‰, ์ „์ฒด ์ง‘์„ ์น ํ•œ๋‹ค๋Š” ๊ฒƒ์— ํฌ์ปค์Šค๋ฅผ ๋‘์ง€๋ง๊ณ 
๋ชฉํ‘œ ์ž์ฒด๋ฅผ ์ž‘๊ฒŒํ•ด์„œ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ.

1. ์ž…๋ ฅ๋ฐ›๊ธฐ & dp ์ดˆ๊ธฐํ™” & dp

#define MAX 1001
int N;
int dp[MAX][3];
#define MAX 1001
typedef enum {
    RED,
    GREEN,
    BLUE
} Color;
 
...
 
cin >> N;
int r,g,b;
dp[0][0] = dp[0][1] = dp[0][2] = 0;
for (int i=1; i<=N; ++i) {
    cin >> r >> g >> b;
    dp[i][RED] = min(dp[i-1][GREEN], dp[i-1][BLUE]) + r;
    dp[i][GREEN] = min(dp[i-1][RED], dp[i-1][BLUE]) + g;
    dp[i][BLUE] = min(dp[i-1][RED], dp[i-1][GREEN]) + b;
}
cout << min(dp[N][RED], min(dp[N][GREEN], dp[N][BLUE]));

๊ฐ„๋‹จํ•˜๋‹ค.
๊ฐ dp๋งˆ๋‹ค 3๊ฐ€์ง€์˜ ์ƒ‰๊น” ๋ณ„๋กœ ๋น„์šฉ์„ ๊ฐฑ์‹ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
ํ˜„์žฌ ์น ํ•˜๋Š” ์ƒ‰๊น”๊ณผ ์ด์ „์— ์น ํ•œ ์ƒ‰๊น”์€ ๊ฐ™์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ๋งŒ ์œ ์˜ํ•˜๋ฉด ๋œ๋‹ค.

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
using namespace std;
#define MAX 1001
int N;
int dp[MAX][3];
#define MAX 1001
typedef enum {
    RED,
    GREEN,
    BLUE
} Color;
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N;
    int r,g,b;
    dp[0][0] = dp[0][1] = dp[0][2] = 0;
    for (int i=1; i<=N; ++i) {
        cin >> r >> g >> b;
        dp[i][RED] = min(dp[i-1][GREEN], dp[i-1][BLUE]) + r;
        dp[i][GREEN] = min(dp[i-1][RED], dp[i-1][BLUE]) + g;
        dp[i][BLUE] = min(dp[i-1][RED], dp[i-1][GREEN]) + b;
    }
    cout << min(dp[N][RED], min(dp[N][GREEN], dp[N][BLUE]));
    return 0;
}

Review

9251. LCS

๐Ÿ”— BOJ Link

๋ ๋ฌธ์ž๊ฐ€ ๊ฐ™์ง€ ์•Š์€์ง€์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง€๋Š”๊ฒŒ ํ•ต์‹ฌ.
๊ฐ™์•˜์„๋•Œ๋Š” ์ด์ „ dp๋ฅผ ๊ทธ๋Œ€๋กœ ์ด์šฉ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๋ฌธ์ œ๋„ ์—ญ์‹œ dp๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•˜๊ณ ,
๊ฐ string ์ „์ฒด๋ฅผ ๋ณด์ง€์•Š๊ณ  ์ž‘์€ ๋ถ€๋ถ„๋ฌธ์ž์—ด๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฉด ๋œ๋‹ค.

๊ฐฑ์‹ ๊ณผ์ •์—์„œ ์ด์ „ dp๋ฅผ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐํ™” ์ž‘์—…๋„ ํ•ด์ค˜์•ผํ•œ๋‹ค.

1912. ์—ฐ์†ํ•ฉ

๐Ÿ”— BOJ Link

์ผ๋‹จ ์ด ๋ฌธ์ œ์ž์ฒด๊ฐ€ ๊ทผ๋ณธ์ ์œผ๋กœ ์–ด๋–ค ์—ฐ์†๋œ ๊ฒƒ์„ ์žก์•„์•ผํ• ์ง€ ํ—ท๊ฐˆ๋ฆฌ๊ฒŒ ํ•œ๋‹ค.

๊ฒฐ๊ตญ ํ•ด๊ฒฐ์ฑ…์€ i๋ฒˆ์งธ ์ˆ˜๊นŒ์ง€ ์™”์„๋•Œ ์–ด๋–ค ํŒ๋‹จ์„ ํ•  ๊ฒƒ์ธ๊ฐ€? ์ด๋‹ค.
๋˜ํ•œ ์ผ๋‹จ ์ฒซ๋ฒˆ์งธ ์ˆ˜๋ถ€ํ„ฐ ์„ ํƒํ•˜๊ณ  ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์—ฐ์†ํ•˜๋Š” ์ˆ˜์—ด์ด ๊ผญ ์ฒซ๋ฒˆ์งธ ์ˆ˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•  ํ•„์š”๋Š” ์—†๋Š”๋ฐ?
๋งž๋‹ค. ๊ทผ๋ฐ ๊ฒฐ๊ตญ dp๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ํŒ๋‹จ์—์„œ ๊ฑธ๋Ÿฌ์ง€๊ฒŒ ๋œ๋‹ค.

int ans = dp[1];
for (int i=2; i<=n; ++i) {
    dp[i] = max(num[i], dp[i-1]+num[i]);
    ans = max(ans, dp[i]);
}

์ฆ‰, i๋ฒˆ์งธ ์ˆ˜๊นŒ์ง€ ์™”์„๋•Œ ํ˜„์žฌ ์ˆ˜๋ฅผ ์„ ํƒํ•˜๋ƒ๋งˆ๋ƒ๋กœ ๊ฒฐ์ •์„ ๋‚ด๋ฆฐ๋‹ค๋Š” ๊ฒƒ.
๋งŒ์•ฝ ํ˜„์žฌ๋ฅผ ์„ ํƒํ•˜๋ฉด ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๋ฌธ์ œ์˜ ํŠน์ดํ•œ์ ์€
dp์— ๋‹ด๊ธฐ๋Š” ๊ฐ’์ด ์งˆ์ ์œผ๋กœ ๋™์งˆ์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

14501. ํ‡ด์‚ฌ

๐Ÿ”— BOJ Link

์ด ๋ฌธ์ œ๋Š” ๋งˆ๊ฐ๊ธฐํ•œ์ด๋ผ๋Š” ์†์„ฑ์— ๊ธฐ๋ฐ˜ํ•ด์„œ
dp๋ฅผ ๊ฑฐ๊พธ๋กœ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

for (int i=N-1; i>=1; --i) {
    if (info[i].t + i > N+1) {
        dp[i] = dp[i+1];
    }
    else dp[i] = max(dp[i+1], info[i].p + dp[info[i].t + i]);
}

๋งˆ๊ฐ๊ธฐํ•œ์ด ๋„˜์–ด๊ฐ€๋ฉด ๊ทธ ์ผ์€ ํ•  ์ˆ˜ ์—†๊ณ , ์ด๋ฅผ ๋‹ค์Œ dp๋กœ๋ถ€ํ„ฐ ๋•ก๊ฒจ์˜ค๋Š” ๊ฑธ๋กœ ํ‘œํ˜„.
๊ฐ€๋Šฅํ–ˆ๋‹ค๋ฉด ๋‹น์—ฐํžˆ ๋‹ค์Œ๋‚  dp์™€ ํ˜„์žฌ ์ผ์„ ํ–ˆ์„๋•Œ dp ์ค‘ ํฐ๊ฐ’์„ ์„ ํƒํ•˜๊ฒŒ ๋œ๋‹ค.

1520. ๋‚ด๋ฆฌ๋ง‰ ๊ธธ

๐Ÿ”— BOJ Link

์ด ๋ฌธ์ œ๋Š” ๋ชฉํ‘œ์ง€์ ์— ๋„๋‹ฌํ–ˆ์„๋•Œ return 1์„ ํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ
dp๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์‹œ์ ์— ๋ฐฉ๋ฌธ ์•ˆํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐ•์•„๋†“๊ณ  ๊ฐ€๋Š”๊ฒŒ ํ•ต์‹ฌ์ด๋‹ค.

๋ฐฉ๋ฌธ ์•ˆํ•œ ๊ฑธ 0์œผ๋กœ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
ํ•ด๋‹น ๋ฐฉํ–ฅ์œผ๋กœ๋Š” ๋ชฉํ‘œ์ง€์ ์— ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ๋•Œ๋ฌธ.

dfs + dp ๋ฌธ์ œ์—์„œ ๋Š˜ ๊ทธ๋ ‡๋“ฏ
๊ฒฐ๊ตญ dp๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

25215. ํƒ€์ดํ•‘

๐Ÿ”— BOJ Link

๊ทธ๋ƒฅ ๋‹ค์Œ ๋ฌธ์ž์— ๋Œ€ํ•ด ์กฐ์‚ฌํ•˜๋ฉด์„œ ์ตœ์ ์˜ ํ–‰๋™์„ ํ•˜๋Š” ๋ฌธ์ œ.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜„์žฌ๊ฐ€ ์†Œ๋ฌธ์ž๊ณ  ๋‹ค์Œ๋ฌธ์ž๋„ ์†Œ๋ฌธ์ž๋ผ๋ฉด
์บก์Šค๋ฝ์ด ๋ˆŒ๋Ÿฌ์ ธ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ์บก์Šค๋ฝ์„ ๊บผ์ฃผ๋Š” ๊ฒƒ์ด ์ตœ์„ ์ด๋‹ค.

2533. ์‚ฌํšŒ๋ง ์„œ๋น„์Šค

๐Ÿ”— BOJ Link


4์ฃผ์ฐจ : Greedy

๋ชฉ์ฐจ

1026. ๋ณด๋ฌผ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

์ž…๋ ฅ์œผ๋กœ ๊ธธ์ด N์˜ ๋‘ ๋ฐฐ์—ด A, B๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
์ด๋•Œ ํ•จ์ˆ˜ S๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋œ๋‹ค.

S = A[0] ร— B[0] + ... + A[N-1] ร— B[N-1]

S์˜ ๊ฐ’์„ ๊ฐ€์žฅ ์ž‘๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด A์˜ ์ˆ˜๋ฅผ ์žฌ๋ฐฐ์—ดํ•˜์ž.
S์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ.

ํ•ด์„ค

๋„ˆ๋ฌด ๊ฐ„๋‹จํ–ˆ๋‹ค.

A๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ, B๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์„ ํ•ด์„œ
๊ฐ๊ฐ์„ ๊ณฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ตœ์†Ÿ๊ฐ’์„ ๋งŒ๋“ค์–ด ๋‚ด๋ ค๋ฉด
ํฐ์ˆ˜ * ํฐ์ˆ˜ ๋ณด๋‹ค๋Š” ํฐ์ˆ˜ * ์ž‘์€์ˆ˜๋ฅผ ๊ณฑํ•ด์•ผํ•˜๊ณ 
์ด๋ ‡๊ฒŒ ์—ฐ์‚ฐํ–ˆ์„ ๋•Œ ์ตœ์†Ÿ๊ฐ’์ด greedyํ•˜๊ฒŒ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 50
int N;
int A[MAX], B[MAX];
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N;
 
    for (int i=0; i<N; ++i) cin >> A[i];
    for (int i=0; i<N; ++i) cin >> B[i];
 
    sort(A, A+N);
    sort(B, B+N, greater<int>());
 
    int ans = 0;
    for (int i=0; i<N; ++i) ans += A[i]*B[i];
    cout << ans;
    return 0;
}

1202. ๋ณด์„ ๋„๋‘‘

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

๋ณด์„ N๊ฐœ์™€ ๊ฐ€๋ฐฉ K๊ฐœ๊ฐ€ ์žˆ๋‹ค.
๊ฐ ๋ณด์„์€ ๋ฌด๊ฒŒ M, ๊ฐ€๊ฒฉ V๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ž…๋ ฅ์œผ๋กœ ๋จผ์ € N, K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
๊ทธ ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ๊ฐ ๋ณด์„์˜ ๋ฌด๊ฒŒ์™€ ๊ฐ€๊ฒฉ์ด ์ฃผ์–ด์ง„๋‹ค.
๊ทธ ๋‹ค์Œ K๊ฐœ์˜ ๊ฐ€๋ฐฉ์— ๋Œ€ํ•ด ์ตœ๋Œ€๋กœ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์˜ˆ์‹œ) ๋ณด์„์ด 3๊ฐœ์ด๊ณ  ๊ฐ€๋ฐฉ์ด 2๊ฐœ์ธ ๊ฒฝ์šฐ
3 2 => (N, K)
1 65 => (๋ฌด๊ฒŒ, ๊ฐ€๊ฒฉ)
5 23
2 99
10 2 => (๊ฐ€๋ฐฉ ์ตœ๋Œ€ ํ—ˆ์šฉ ๋ฌด๊ฒŒ)

์ด๋ ‡๊ฒŒ ๋ณด์„๊ณผ ๊ฐ€๋ฐฉ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ
๊ฐ€๋ฐฉ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ณด์„ ๊ฐ€๊ฒฉ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•ด๋ณด์ž.

ํ•ด์„ค

0. ์•„์ด๋””์–ด

์œ„์™€ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ greedyํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

ํ˜„์žฌ ๊ฐ€๋ฐฉ์ด ํ—ˆ์šฉํ•˜๋Š” ๋ฌด๊ฒŒ ๋ฒ”์œ„ ์•ˆ์— ์žˆ๋Š” ๋ณด์„๋“ค์„ ์ „๋ถ€ ๋‹ค ๋‹ด๊ณ 
๊ฑฐ๊ธฐ์„œ ๊ฐ€์žฅ ๊ฐ€์น˜๊ฐ€ ๋†’์€ ๋ณด์„์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋‹ค์Œ ๊ฐ€๋ฐฉ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ณด์ž.

ํ˜„์žฌ max heap์—๋Š” ์ด์ „ ๊ฐ€๋ฐฉ๊ธฐ์ค€ ํ—ˆ์šฉ๋˜์—ˆ๋˜ ๋ณด์„๋“ค์ด ๋‹ด๊ฒจ์žˆ๋‹ค.
ํ˜„์žฌ ๊ฐ€๋ฐฉ์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ€๋ฐฉ์ด ํ—ˆ์šฉํ•˜๋Š” ๋ฒ”์œ„์˜ ๋ณด์„๋“ค์„ ๋‹ด๊ฒŒ๋œ๋‹ค.

์ด๋“ค์€ ์ด์ „๊ณผ ๋˜‘๊ฐ™์€ max heap์— ๋‹ด๊ธฐ๊ฒŒ ๋˜๊ณ 
์ด๋ฅผ ํ†ตํ•ด ํ•ญ์ƒ greedyํ•œ ์„ ํƒ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

1. ๋ณด์„, ๊ฐ€๋ฐฉ ์ž…๋ ฅ๋ฐ›๊ธฐ

struct jewel {
    int m, v;
};
 
...
 
int mi,vi;
vector<jewel> jwl;
for (int i=0; i<N; ++i) {
    cin >> mi >> vi;
    jwl.push_back({mi, vi});
}
 
vector<int> bag;
for (int i=0; i<K; ++i) {
    int x; cin >> x; bag.push_back(x);
}

๋ณ„๋‹ค๋ฅธ๊ฒŒ ์—†๋‹ค.
๋ณด์„์„ ์œ„ํ•ด์„œ ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ž…๋ ฅ๋ฐ›์•˜๋‹ค.

2. ์ •๋ ฌ

sort(begin(jwl), end(jwl), [](const jewel& j1, const jewel& j2){
    return j1.m < j2.m;
});
sort(begin(bag), end(bag));

๋ณด์„์€ ๋ฌด๊ฒŒ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์„ ํ•ด์ฃผ๊ณ ,
๊ฐ€๋ฐฉ์€ ์ตœ๋Œ€ํ—ˆ์šฉ๋ฌด๊ฒŒ ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์„ ํ•ด์ฃผ์—ˆ๋‹ค.

3. ๊ฐ€๋ฐฉ ์ˆœํšŒ

priority_queue<int, vector<int>, less<int>> max_pq;
ll ans = 0; int cnt = 0;
for (int i=0; i<K; ++i) {
    while (cnt < N && jwl[cnt].m <= bag[i]) {
        max_pq.push(jwl[cnt].v); ++cnt;
    }
 
    if (max_pq.empty()) continue;
    ans += max_pq.top(); max_pq.pop();
}
cout << ans;

max_pq ๋ผ๋Š” max heap์„ ๋งŒ๋“ ๋‹ค.

์•„์ด๋””์–ด์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ
ํ˜„์žฌ ๊ฐ€๋ฐฉ์ด ํ—ˆ์šฉํ•˜๋Š” ๋ฌด๊ฒŒ ๋ฒ”์œ„ ์•ˆ์— ์žˆ๋Š” ๋ณด์„๋“ค์„
์‹ค์ œ ๊ฐ€๋ฐฉ์— ๋ณด์„์„ ๋‹ด๊ธฐ ์ „, ๋ฏธ๋ฆฌ ์ž‘์—…์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ.

while (cnt < N && jwl[cnt].m <= bag[i]) {
    max_pq.push(jwl[cnt].v); ++cnt;
}

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;
struct jewel {
    int m; int v;
};
int N,K;
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N >> K;
    int mi,vi;
    vector<jewel> jwl; vector<int> bag;
    for (int i=0; i<N; ++i) {
        cin >> mi >> vi;
        jwl.push_back({mi, vi});
    }
 
    for (int i=0; i<K; ++i) {
        int x; cin >> x; bag.push_back(x);
    }
 
    sort(begin(jwl), end(jwl), [](const jewel& j1, const jewel& j2){ return j1.m < j2.m; });
    sort(begin(bag), end(bag));
 
    priority_queue<int, vector<int>, less<int>> max_pq;
    ll ans = 0; int cnt = 0;
    for (int i=0; i<K; ++i) {
        while (cnt < N && jwl[cnt].m <= bag[i]) {
            max_pq.push(jwl[cnt].v); ++cnt;
        }
 
        if (max_pq.empty()) continue;
        ans += max_pq.top(); max_pq.pop();
    }
    cout << ans;
    return 0;
}

Review

1946. ์‹ ์ž… ์‚ฌ์›

๐Ÿ”— BOJ Link

์ด ๋ฌธ์ œ์˜ ๊ทธ๋ฆฌ๋””ํ•จ์€ ์ •๋ ฌ์„ ํ†ตํ•ด์„œ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ๊ตญ ์–ด๋–ค ์„ฑ์ ์ด๊ฑด 1๋“ฑ์ธ ์• ๋Š” ๋ฌด์กฐ๊ฑด ๋ฝ‘ํžŒ๋‹ค.
๋‹จ ํ•œ๊ฐœ๋ผ๋„ ๋‹ค๋ฅธ ์ง€์›์ž๋ณด๋‹ค ๋–จ์–ด์ง€์ง€ ์•Š์œผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

int N, a, b;
vector<pii> v;
for (int i=0; i<N; ++i) {
    cin >> a >> b;
    v.push_back({a, b});
}
sort(begin(v), end(v));

์ด๋ ‡๊ฒŒ ํ•œ๊ฐœ์˜ ์„ฑ์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

int ans = 1;
int tmp = 0;
for (int i=1; i<N; ++i) {
    if (v[tmp].second < v[i].second) continue;
    ++ans; tmp = i;
}

๊ทธ ์„ฑ์ ์—์„œ 1๋“ฑ์ธ ์• ๋Š” ๋ฌด์กฐ๊ฑด ํฌํ•จ์‹œ์ผœ๋†“๊ณ 
๋‹ค๋ฅธ ์„ฑ์ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์† ๋น„๊ตํ•˜๋ฉด์„œ ํ’€์–ด๋‚ด๋ฉด ๋œ๋‹ค.

ํ•œ๊ฐœ์˜ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์‹œ์ผœ๋†จ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฑธ๋กœ๋งŒ ๋น„๊ตํ•˜๋ฉด ๋จ.

1781. ์ปต๋ผ๋ฉด

๐Ÿ”— BOJ Link

์ด ๋ฌธ์ œ์˜ ๊ทธ๋ฆฌ๋””ํ•จ์€ ๋ฐ๋“œ๋ผ์ธ์ด๋ผ๋Š” ์†์„ฑ์—์„œ ๋‚˜์˜จ๋‹ค.

#define MAX 200001
vector<int> v[MAX];
 
...
 
int d,r;
for (int i=0; i<N; ++i) {
    cin >> d >> r;
    v[d].push_back(r);
}

์›๋ž˜ ๋งˆ๊ฐ๊ธฐํ•œ๋ณ„ ๋ณด์ƒ์— ๋Œ€ํ•œ vector ๋ฐฐ์—ด์—์„œ MAX๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค.

unordered_set ๊ฐ™์€ ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์–ธ๊ธ‰๋œ ๋งˆ๊ฐ๊ธฐํ•œ๋งŒ ๊ด€๋ฆฌํ•ด์ฃผ๋ ค ํ–ˆ๋Š”๋ฐ
๋ฌธ์ œ๋Š” ๋งˆ๊ฐ๊ธฐํ•œ์ด ์•„๋‹Œ ๋‚ ์งœ์—๋„ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ๋ฅผ ๋†“์ณค์—ˆ๋‹ค.

priority_queue<int, vector<int>, less<int>> reward;
for (int i=N; i>=1; --i) {
    for (const auto& x : v[i]) reward.push(x);
    if (reward.empty()) continue;
    ans += reward.top(); reward.pop();
}

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ๋งˆ๊ฐ๊ธฐํ•œ์„ ์—ญ์ˆœ์œผ๋กœ ์žก๊ณ  ๊ฐ„๋‹ค๋Š” ๊ฒƒ. 11501. ์ฃผ์‹ ๋ฌธ์ œ ๋˜ํ•œ ์ด๋Ÿฐ ๋Š๋‚Œ์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค.

์ตœ๋Œ€ ๋งˆ๊ฐ๊ธฐํ•œ์„ ์•Œ๊ณ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด๋ฉฐ
๊ทธ๋žฌ๊ธฐ๋•Œ๋ฌธ์— greedyํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
ํ˜„์žฌ ์ผ์ฐจ ์ดํ›„์˜ ๋งˆ๊ฐ๊ธฐํ•œ์ธ ์ผ๋“ค์€ ์ „๋ถ€ ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ.

๊ทธ๋Ÿฌ๋ฉด ๊ทธ ๋งŽ์€ ๊ฒƒ๋“ค ์ค‘์— ๋ˆ„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š”๊ฐ€? => max heap์œผ๋กœ ์ฒ˜๋ฆฌ

1541. ์žƒ์–ด๋ฒ„๋ฆฐ ๊ด„ํ˜ธ

๐Ÿ”— BOJ Link

์กฐ๊ธˆ ํ—ค๋ฉ˜ ์ด์œ ๋Š” -(minus) ๋ฅผ ๋งŒ๋‚œ ์ƒํƒœ์—์„œ
๋‹ค์Œ -(minus) ๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์ €์žฅ์„ ํ•ด์ค˜์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค.

string s; cin >> s;
string cur = "";
int ans = 0;
int minus_store = 0; bool is_minus = false;
for (const auto& c : s) {
    if (c != '+' && c != '-') {
        cur += c;
        continue;
    }
 
    if (c == '+') {
        if (is_minus) minus_store += stoi(cur);
        else ans += stoi(cur);
        cur.clear();
        continue;
    }
 
    if (c == '-') {
        if (is_minus) {
            minus_store += stoi(cur);
            ans -= minus_store; minus_store = 0;
        }
        else {
            is_minus = true;
            ans += stoi(cur);
        }
        cur.clear();
    }
}

๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ๋ณต์žกํ•ด์กŒ๋‹ค.
๋ฟ๋งŒ์•„๋‹ˆ๋ผ ๋ฃจํ”„ ํƒˆ์ถœํ•˜๊ณ  ๋‚จ์€ leftover๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๋„ ์ฉ ๋งค๋„๋Ÿฝ์ง€ ์•Š์•˜๋‹ค.

๊ทผ๋ฐ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ทธ๋ƒฅ is_minus ๋ฉด
๊ฐ„๋‹จํ•˜๊ฒŒ ๋นผ๋ฉด ๋˜๊ณ  ์•„๋‹ˆ๋ฉด ๋”ํ•˜๋ฉด ๋œ๋‹ค.

for (int i=0; i<=input.length(); ++i) {
    if (input[i] == '-' || input[i] == '+' || i == input.length()) {
        if (is_minus) ans -= stoi(num);
        else ans += stoi(num);
        num.clear();
    }
    else num += input[i];
 
    if (input[i] == '-') is_minus = true;
}

๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ 2๊ฐ€์ง€์ธ๋ฐ

is_minus๊ฐ€ ๊ณ„์† ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๊ฑฐ๋Š” ์–ด์ฉ” ์ˆ˜ ์—†๋‹ค.

2812. ํฌ๊ฒŒ ๋งŒ๋“ค๊ธฐ

๐Ÿ”— BOJ Link

์ •๋ ฌ ๊ฐ™์€ ๊ฒŒ ์ „ํ˜€ ์•„๋‹Œ ๊ทธ๋ƒฅ ์Šคํƒ์— ์ง‘์–ด๋„ฃ์œผ๋ฉด์„œ ํ‘ธ๋Š” ๋ฌธ์ œ.

์ด ๋ฌธ์ œ์—์„œ๋Š” greedyํ•จ์€
๊ทธ๋ƒฅ ์Šคํƒ์˜ top๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฑธ๋กœ ๋งŒ์กฑ๋œ๋‹ค.

for (int i=0; i<N; ++i) {
    while (!stk.empty() && cnt < K && num[i] > stk.top()) {
        stk.pop(); ++cnt;
    }
    stk.push(num[i]);
}
 
while (cnt < K) {
    ++cnt;
    stk.pop();
}

์ผ๋‹จ ์Šคํƒ์— ์ง‘์–ด๋„ฃ์œผ๋ฉด์„œ ๋‹ค์Œ ๋†ˆ๋“ค์€ top๊ณผ ๋น„๊ต๋ฅผ ์ง„ํ–‰.
์ด๋ฒˆ์— ์ง‘์–ด๋„ฃ์„ num[i]๊ฐ€ top๋ณด๋‹ค ํฌ๋‹ค๋ฉด
๋ชฉํ‘œ์ธ "๊ฐ€์žฅ ํฐ ์ˆ˜"์™€ ๋ฉ€์–ด์ง€๋ฏ€๋กœ pop์„ ํ•ด์ค€๋‹ค.

์ตœ๋Œ€ K๋ฒˆ ๊นŒ์ง€๋งŒ pop์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ด์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ๊ฑธ์–ด์ค€๋‹ค.

๋ฃจํ”„ ํƒˆ์ถœ์ดํ›„์— K๋ฒˆ์„ ๋‹ค ๋ชป์ฑ„์› ๋‹ค๋ฉด
์Šคํƒ์— ๊ณผํ•˜๊ฒŒ ๋“ค์–ด์žˆ์œผ๋ฏ€๋กœ ์•Œ๋งž๊ฒŒ popํ•ด์ค€๋‹ค.

11501. ์ฃผ์‹

๐Ÿ”— BOJ Link

์ด ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์ „ํ˜€ ์—ญ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ์ฒ˜์Œ์— ์ƒ๊ฐ ๋ชปํ–ˆ๋‹ค.

๋‚˜๋Š” ๋‚˜๋ฆ„๋Œ€๋กœ greedyํ•œ ํŒ๋‹จ์ด

์ด๋Ÿฐ ์‹์œผ๋กœ ๊ณ„์‚ฐํ–ˆ๋‹ค. ์ƒ๋‹นํžˆ ๋ณต์žกํ–ˆ๊ณ , ๊ฒฐ๊ณผ ๋˜ํ•œ ํ‹€๋ ธ์œผ๋ฉฐ
์‹œ๊ฐ„์ดˆ๊ณผ์ด๊ณ  ๋ญ๊ณ  ๋”ฐ์ ธ๋ณผ ์ˆ˜๋„ ์—†์—ˆ๋‹ค.

ll ans = 0; int temp_max = 0;
for (int i=N-1; i>=0; --i) {
    temp_max = max(temp_max, num[i]);
    ans += (temp_max - num[i]);
}

์‹œ๊ฐ„ํ๋ฆ„์„ ๊ฑฐ๊พธ๋กœ ์žก์•„์„œ ํŒ๋‹จํ•˜๋Š”๊ฒŒ ์ง„์งœ dope ๊ทธ์ž์ฒด๋‹ค.

๊ทธ๋ƒฅ ์ตœ๋Œ“๊ฐ’์ด ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค ๊ทธ๊ฑฐ ๊ธฐ์ค€์œผ๋กœ
temp_max ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  num[i] ์™€์˜ ์ฐจ์ด๋ฅผ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

1700. ๋ฉ€ํ‹ฐํƒญ ์Šค์ผ€์ค„๋ง

๐Ÿ”— BOJ Link

๊ธฐ์ค€์„ ์žก๊ธฐ ์–ด๋ ค์› ๋‹ค.

๋ญ๊ฐ€ ๋๊ฑด greedyํ•œ ํŒ๋‹จ์€ ์•„๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ์šฐ๊ธฐ๋Š” ๊ฑฐ์— ๋ถˆ๊ณผํ–ˆ๋‹ค.

๊ถ๊ทน์ ์œผ๋กœ ๊ฐ ์Šค์ผ€์ค„์ด ์‚ฌ์šฉ ์ˆœ์„œ๋Œ€๋กœ ์ธํ’‹์ด ๋“ค์–ด์˜ค๋Š”๋ฐ
์–ด๋–ป๊ฒŒ ์ด๊ฑธ ๊ทธ๋•Œ๊ทธ๋•Œ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์„๊นŒ๋ผ๋Š” ์˜๋ฌธ์ด ํ’€๋ฆฌ์ง€ ์•Š์•˜๋‹ค.

int N, K; cin >> N >> K;
for (int i=0; i<K; ++i) {
    cin >> schedule[i];
}
 
int ans = 0;
for (int i=0; i<K; ++i) {
    bool flag = false;
    for (int j=0; j<N; ++j) {
        if (multitap[j] == schedule[i]) {
            flag = true;
            break;
        }
    }
    if (flag) continue;
 
    for (int j=0; j<N; ++j) {
        if (multitap[j] == 0) {
            flag = true;
            multitap[j] = schedule[i];
            break;
        }
    }
    if (flag) continue;
 
    int prev = -1, idx = -1;
    for (int j=0; j<N; ++j) {
        int tmp = 0;
        for (int t=i+1; t<K; ++t) {
            if (multitap[j] == schedule[t]) break;
            ++tmp;
        }
 
        if (tmp > prev) {
            prev = tmp; idx = j;
        }
    }
 
    multitap[idx] = schedule[i];
    ++ans;
}

๊ฐ ์Šค์ผ€์ค„์€ ๋จผ์ € ๋‘๊ฐ€์ง€ ๊ธฐ๋ณธ์ „๋žต์ด ์žˆ๋Š”๋ฐ

๊ทธ๋ฆฌ๊ณ  ์ด ๋‘˜์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ–ˆ์„ ๋•Œ ํ›„์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ํ๋ฆ„๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ–ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋„ ์ƒ๋‹นํžˆ ์ธ์ƒ์ ์ธ ๊ฒƒ์€
๋ชจ๋“  ๋ฉ€ํ‹ฐํƒญ๋“ค์„ ์ˆœํšŒํ•˜๋ฉด์„œ
ํ˜„์žฌ ์Šค์ผ€์ค„ ์ดํ›„์˜ ์Šค์ผ€์ค„๋“ค ์ค‘์—์„œ
ํ˜„์žฌ ๋ฉ€ํ‹ฐํƒญ๊ณผ ์ผ์น˜ํ•˜๋Š” ์ˆœ๊ฐ„์— ์ฃผ๋ชฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๊ฒƒ์„ ํ†ตํ•ด "๊ฐ€์žฅ ๋‚˜์ค‘์— ์‚ฌ์šฉ๋˜๋Š” ์Šค์ผ€์ค„"์„ ์ฐพ๋Š”๋‹ค.

๋ฌธ์ œ์ž์ฒด๊ฐ€ ํ”Œ๋Ÿฌ๊ทธ๋ฅผ ๋นผ๋Š” ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ์•ผ ํ•˜๋Š”๊ฒŒ ๋ชฉํ‘œ์ด๋ฏ€๋กœ
์ด๋Ÿฐ ์‹์œผ๋กœ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด greedyํ•œ ํŒ๋‹จ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.


3์ฃผ์ฐจ : ์ด๋ถ„ํƒ์ƒ‰

๋ชฉ์ฐจ

1253. ์ข‹๋‹ค

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

์–ด๋–ค ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์ˆ˜ 2๊ฐœ์˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด,
์ด ์ˆ˜๋ฅผ "์ข‹๋‹ค(GOOD)" ๋ผ๊ณ  ํ•˜์ž.

N ๊ฐœ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด ๋“ค์ค‘ ์ข‹์€ ์ˆ˜๋Š” ๋ช‡๊ฐœ์ธ์ง€ ๊ตฌํ•ด๋ณด์ž.

์˜ˆ์‹œ)
1 2 3 4 5 6 7 8 9 10 ์ด ์ฃผ์–ด์ง€๋ฉด
3,4,5,6,7,8,9,10์€ ์ข‹๋‹ค.


ํ•ด์„ค

1. ์ž…๋ ฅ๋ฐ›๊ธฐ

vector<int> v;
 
...
 
cin >> N;
for (int i=0; i<N; ++i) {
    int x; cin >> x; v.push_back(x);
}
sort(begin(v), end(v));

์ด๋ถ„ํƒ์ƒ‰์„ ์œ„ํ•ด N๊ฐœ์˜ ์ˆ˜๋“ค์„ ๋ฒกํ„ฐ์— ๋‹ด๊ณ  ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์„ ํ•œ๋‹ค.

2. ์ด๋ถ„ํƒ์ƒ‰

int ans = 0;
for (int i=0; i<N; ++i) {
    int start = 0, end = v.size()-1;
    while (start < end) {
        if (start == i) { ++start; continue; }
        if (end == i) { --end; continue; }
 
        int sum = v[start]+v[end];
        if (sum == v[i]) { ++ans; break; }
 
        if (sum > v[i]) --end;
        else ++start;
    }
}
2-a) ๋ฒกํ„ฐ์˜ ๋‹ด๊ธด ์ˆ˜๋“ค์„ ํ•˜๋‚˜์”ฉ ์ˆœํšŒํ•œ๋‹ค.
for (int i=0; i<N; ++i) {
    ...
}
2-b) ์ด๋ถ„ํƒ์ƒ‰์„ ์œ„ํ•œ start, end ์„ค์ •
for (int i=0; i<N; ++i) {
    // ์ถ”๊ฐ€
    int start = 0, end = v.size()-1;
    ...
}

ํƒ์ƒ‰์˜ ๊ธฐ์ค€์€ ์ธ๋ฑ์Šค๋กœ ์žก์•˜๋‹ค.
๋”ฐ๋ผ์„œ start๋Š” ๊ฐ€์žฅ ์ž‘์€ 0์„, end๋Š” ๊ฐ€์žฅ ํฐ v.size()-1์„ ์žก๋Š”๋‹ค.

2-c) ํˆฌํฌ์ธํ„ฐ๋กœ ํƒ์ƒ‰
int ans = 0;
for (int i=0; i<N; ++i) {
    int start = 0, end = v.size()-1;
    while (start < end) {
        if (start == i) { ++start; continue; }
        if (end == i) { --end; continue; }
 
        int sum = v[start]+v[end];
        if (sum == v[i]) { ++ans; break; }
 
        if (sum > v[i]) --end;
        else ++start;
    }
}

์ˆœํšŒํ•˜๋ฉด์„œ ํ•ด๋‹น ์ˆ˜๊ฐ€
์ž๊ธฐ ์ž์‹ ์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋‘ ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜๋ฉด ๋œ๋‹ค.

์ด๋ถ„ํƒ์ƒ‰ ๋ฃจํ”„์˜ ํƒˆ์ถœ ์กฐ๊ฑด์€ start < end ๋กœ ์žก์•˜๋Š”๋ฐ,
๊ทธ ์ด์œ ๋Š” ์ž๊ธฐ ์ž์‹ ์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋‘ ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์–ด์•ผ
GOOD์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋งŒ์•ฝ start ๋‚˜ end๊ฐ€ ํ˜„์žฌ ํƒ์ƒ‰ ์ธ๋ฑ์Šค i์™€ ๊ฐ™์•„์ง€๋Š” ์ƒํ™ฉ์ด ์˜จ๋‹ค๋ฉด
ํˆฌํฌ์ธํ„ฐ์˜ ๋…ผ๋ฆฌ์— ๋”ฐ๋ผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ++start, --end๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

ans๋ฅผ ํ†ตํ•ด GOOD์ธ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

๋งŒ์•ฝ sum์ด ํ˜„์žฌ ํƒ์ƒ‰ํ•˜๋Š” ์ˆ˜๋ณด๋‹ค ์ปธ๋‹ค๋ฉด ๋‹น์—ฐํžˆ --end๋ฅผ ํ•ด์ฃผ๊ณ ,
์ž‘์•˜๋‹ค๋ฉด ++start๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N;
vector<int> v;
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N;
    for (int i=0; i<N; ++i) {
        int x; cin >> x; v.push_back(x);
    }
    sort(begin(v), end(v));
 
    int ans = 0;
    for (int i=0; i<N; ++i) {
        int start = 0, end = v.size()-1;
        while (start < end) {
            if (start == i) { ++start; continue; }
            if (end == i) { --end; continue; }
 
            int sum = v[start]+v[end];
            if (sum == v[i]) { ++ans; break; }
 
            if (sum > v[i]) --end;
            else ++start;
        }
    }
    cout << ans;
    return 0;
}

2343. ๊ธฐํƒ€ ๋ ˆ์Šจ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

์ž…๋ ฅ์œผ๋กœ ๊ฐ•์˜ ๊ฐœ์ˆ˜ N, ๋ธ”๋ฃจ๋ ˆ์ด ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค

N๊ฐœ์˜ ๊ฐ•์˜๋ฅผ M๊ฐœ์˜ ๋ธ”๋ฃจ๋ ˆ์ด์— ๋‚˜๋ˆ ๋‹ด์•˜์„ ๋•Œ
๊ฐ€์žฅ ๊ฐ•์˜์‹œ๊ฐ„์„ ๊ธธ๊ฒŒ ๋‹ด๊ณ ์žˆ๋Š” ๋ธ”๋ฃจ๋ ˆ์ด๊ฐ€ ๊ธฐ์ค€์ด ๋˜๋ฉฐ
์ด๋ฅผ ๋ธ”๋ฃจ๋ ˆ์ด์˜ ํฌ๊ธฐ๋ผ๊ณ  ํ•œ๋‹ค.

์˜ˆ์‹œ)
9 3 => (N, M)
1 2 3 4 5 6 7 8 9 => N๊ฐœ์˜ ๊ฐ•์˜์‹œ๊ฐ„

M์ด 3์ธ ๊ฒฝ์šฐ์ด๋ฏ€๋กœ, (1 2 3 4 5) (6 7) (8 9) ์ด๋ ‡๊ฒŒ ๋‹ด์•˜๋‹ค๋ฉด
๊ฐ ๋ธ”๋ฃจ๋ ˆ์ด์˜ ํฌ๊ธฐ๋Š” 15, 13, 17์ด ๋œ๋‹ค.
๊ฐ€์žฅ ๊ธด ๊ฐ•์˜์‹œ๊ฐ„์„ ๋‹ด์€ ๋ธ”๋ฃจ๋ ˆ์ด๋Š” 17์ด๋ฉฐ ์ด๊ฒƒ์ด ๋ธ”๋ฃจ๋ ˆ์ด์˜ ํฌ๊ธฐ๊ฐ€ ๋œ๋‹ค.

๋‹จ, ๊ฐ•์˜๋Š” ์—ฐ์†๋˜๊ฒŒ ๋‹ด์•„์•ผํ•œ๋‹ค.
์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ (1 2 6 9) (3 5) (4 7 8) ์ด๋Ÿฐ ์‹์œผ๋กœ ๋‹ด์„ ์ˆ˜ ์—†๋‹ค.

์ฆ‰, N๊ณผ M์ด ์ฃผ์–ด์กŒ์„๋•Œ ๊ฐ๊ฐ์˜ ๋ธ”๋ฃจ๋ ˆ์ด์—
์—ฐ์†๋œ ๊ฐ•์˜๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋งŽ์€ ๋ฐฉ๋ฒ•๋“ค ์ค‘
๊ฐ€์žฅ ์ž‘์€ ๋ธ”๋ฃจ๋ ˆ์ด์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•ด๋ณด์ž.

ํ•ด์„ค

1. input ๋ฐ ์ด๋ถ„ํƒ์ƒ‰ ์ „์— low, high ์„ค์ •

vector<int> v;
int N,M;
 
...
 
int total = 0;
cin >> N >> M;
for (int i=0; i<N; ++i) {
    int x; cin >> x; v.push_back(x);
    total += x;
}
 
int l = *max_element(begin(v), end(v)), r = total;

์ด๋ถ„ํƒ์ƒ‰์˜ ๊ธฐ์ค€์€ ๊ฐ•์˜ ์‹œ๊ฐ„ ์„ ๊ธฐ์ค€์œผ๋กœ ํ•  ๊ฒƒ์ด๋‹ค.

์–ด๋–ค์‹์œผ๋กœ ๊ฐ•์˜๋“ค์„ ๋ธ”๋ฃจ๋ ˆ์ด๋“ค์— ๋‹ด๊ฑด ์ƒ๊ด€์—†์ด
๊ฐ•์˜์‹œ๊ฐ„๋“ค ์ค‘ ๊ฐ€์žฅ ๊ธด ๊ฐ•์˜์‹œ๊ฐ„์„ ํ•˜ํ•œ์œผ๋กœ ์žก์„ ์ˆ˜ ์žˆ๋‹ค.
์–ด๋–ป๊ฒŒ ์ชผ๊ฐœ๋“ ์ง€ ๊ทธ ์ง‘๋‹จ ์ค‘์—๋Š” ๊ฐ€์žฅ ๊ธด ๊ฐ•์˜๊ฐ€ ๋“ค์–ด์žˆ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ.

๋‹น์—ฐํžˆ ์ƒํ•œ์€ ์ „๋ถ€ ๊ฐ•์˜์‹œ๊ฐ„์„ ํ•ฉํ•œ ๊ฐ’์ด ๋  ๊ฒƒ์ด๋‹ค.

2. ์ด๋ถ„ํƒ์ƒ‰

while (l <= r) {
    int mid = (l+r) / 2;
    int sum = 0;
    int cnt = 0;
 
    for (int i=0; i<N; ++i) {
        if (sum + v[i] > mid) {
            sum = 0;
            ++cnt;
        }
        sum += v[i];
    }
    if (sum != 0) ++cnt;
 
    if (cnt > M) l = mid+1;
    else r = mid-1;
}
cout << l;
2-a) ๊ฐ•์˜๋ณ„๋กœ ์ˆœํšŒํ•˜๋ฉฐ mid๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ
for (int i=0; i<N; ++i) {
    if (sum + v[i] > mid) {
        sum = 0;
        ++cnt;
    }
    sum += v[i];
}

sum์—๋‹ค๊ฐ€ ๊ฐ•์˜์‹œ๊ฐ„ (v[i]) ๋ฅผ ๋”ํ•ด๊ฐ€๋ฉด์„œ mid๋ณด๋‹ค ์ปค์ง€๋Š”์ง€๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค.

๋งŒ์•ฝ ์ปธ๋‹ค๋ฉด ํ•˜๋‚˜์˜ ๋ธ”๋ฃจ๋ ˆ์ด๋กœ ๋ถ„๋ฆฌ์‹œํ‚จ๋‹ค.
๋”ฐ๋ผ์„œ sum์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๋ธ”๋ฃจ๋ ˆ์ด ๊ฐœ์ˆ˜ cnt๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

2-b) cnt๊ฐ€ M๋ณด๋‹ค ํฌ๋‹ค๋ฉด l์„ mid+1๋กœ
for (int i=0; i<N; ++i) {
    ...
}
if (sum != 0) ++cnt;

๊ฒฝ๊ณ„๊ฐ’์— ์œ ์˜ํ•˜์ž.
๋งˆ์ง€๋ง‰์— ์ ˆ๋ฌ˜ํ•˜๊ฒŒ ๊ฒฝ๊ณ„์ธ mid๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด์„œ ํ•˜๋‚˜์˜ ๋ธ”๋ฃจ๋ ˆ์ด๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๊ทธ๋ƒฅ for loop ๋ฒ”์œ„ ์กฐ๊ฑด๋•Œ๋ฌธ์— ๋‚˜์™€๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ for loop์„ ๋น ์ ธ๋‚˜์˜จ ๋’ค์—๋„ sum์— ๋Œ€ํ•ด ๊ฒ€์ฆ์„ ํ•ด์„œ
0์ด ์•„๋‹ˆ๋ฉด ๋ธ”๋ฃจ๋ ˆ์ด ๊ฐœ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์ค€๋‹ค.

2-c) ์ด๋ถ„ํƒ์ƒ‰
if (cnt > M) l = mid+1;
else r = mid-1;

ํ˜„์žฌ ๋ถ„๋ฆฌํ•ด๋‚ธ ๋ธ”๋ฃจ๋ ˆ์ด ๊ฐœ์ˆ˜๊ฐ€ ์š”๊ตฌ๋˜๋Š” ์ œํ•œ์‚ฌํ•ญ์ธ M๋ณด๋‹ค ๋งŽ์€ ๊ฒฝ์šฐ:
ํ•˜ํ•œ์„ ํ‚ค์›Œ์ค˜์„œ ๋ธ”๋ฃจ๋ ˆ์ด๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ธฐ์ค€์„ ๋†’์—ฌ์ค€๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ๋ธ”๋ฃจ๋ ˆ์ด ๊ฐœ์ˆ˜๋ฅผ ์ค„์ด๊ณ  M์— ๊ทผ์ ‘ํ•˜๋„๋ก ํ•œ๋‹ค.

์ž‘์€ ๊ฒฝ์šฐ๋Š” vice versa.

2-d) ๊ฒฐ๊ณผ ์ถœ๋ ฅ
cout << l;

์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋‹ค๋ณด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ l์ด ๊ณง ๋‹ต์ด ๋œ๋‹ค.
์ด๋ถ„ ํƒ์ƒ‰์˜ ์˜์˜์ด๋‹ค.

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N,M;
vector<int> v;
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    int total = 0;
    cin >> N >> M;
    for (int i=0; i<N; ++i) {
        int x; cin >> x; v.push_back(x);
        total += x;
    }
 
    int l = *max_element(begin(v), end(v)), r = total;
    while (l <= r) {
        int mid = (l+r) / 2;
        int sum = 0;
        int cnt = 0;
 
        for (int i=0; i<N; ++i) {
            if (sum + v[i] > mid) {
                sum = 0;
                ++cnt;
            }
            sum += v[i];
        }
        if (sum != 0) ++cnt;
 
        if (cnt > M) l = mid+1;
        else r = mid-1;
    }
    cout << l;
    return 0;
}

Review

9460. ๋ฉ”ํƒˆ

๐Ÿ”— BOJ Link

๊ฐ€์žฅ ์–ด๋ ค์šด ๋ฌธ์ œ์˜€๋‹ค.
๋ฉ”ํƒˆ์˜ ๊ฐ„๊ฒฉ์— ๊ธฐ๋ฐ˜ํ•ด์„œ ์ƒํ•˜ํ•œ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์žก์•˜๋‹ค.

double l = 0.0, r = 200000000.0;

ํ•˜์ง€๋งŒ ๋‹ค์Œ๋ถ€ํ„ฐ ๋ฌธ์ œ๊ฐ€
์ฒซ์งธ๋กœ๋Š” ์–ด๋–ป๊ฒŒ ์ด๋ถ„ ํƒ์ƒ‰ loop๋ฅผ ํƒˆ์ถœํ•˜๋Š” ์กฐ๊ฑด์„ ์žก์•„์•ผํ• ์ง€ ๊ฐ์ด ์•ˆ์™”๋‹ค.

while (r - l > 0.01) {...}

์ด๊ฑธ ๋ณด๋ฉฐ ์ถฉ๊ฒฉ์ด ๋“ ๊ฒŒ ์–ด๋–ป๊ฒŒ ์†Œ์ˆ˜์  ํ•œ์ž๋ฆฌ๊นŒ์ง€๋งŒ ์ถœ๋ ฅํ•œ๋‹ค๋Š” ๊ฑฐ์—์„œ
์ด๋Ÿฐ ์กฐ๊ฑด์„ ์žก์•„๋‚ด๋Š” ๊ฑด์ง€ ์••๋„์  ์ ˆ๋ง๊ฐ์ด ๋“ค์—ˆ๋‹ค.
๊ณ ๋”ฉ๋•Œ ๋Œ€์ˆ˜๋ถ€๋“ฑ์‹ ์ฆ๋ช…ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ณด๋Š” ๊ธฐ๋ถ„์ด๋‹ค.

๋‘๋ฒˆ์งธ๋Š” ์ด๋ถ„ํƒ์ƒ‰ ๊ทธ์ž์ฒด์— ๋Œ€ํ•œ ์–˜๊ธฐ์ด๋‹ค.

bool check(const double& max_dist) {
    int l = v[0].second, r = v[0].second;
    int cnt = 1;
    for (int i=1; i<n; ++i) {
        if(v[i].second < l) l = v[i].second;
        if(v[i].second > r) r = v[i].second;
 
        if (2 * max_dist >= (r-l)) continue;
        else {
            l = r = v[i].second;
            ++cnt;
        }
    }
 
    if (cnt > k) return false;
    else return true;
}

์ผ๋‹จ check๋ผ๋Š” ํ•จ์ˆ˜์— ๋˜์ง€๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ max_dist ๋ผ๊ณ  ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

check์—์„œ๋Š” ์ด๊ฑธ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„œ metal๋“ค์„ ํƒ์ƒ‰ํ•˜๋ฉฐ
ํ˜„์žฌ metal๊นŒ์ง€์˜ ์ตœ๋Œ€-์ตœ์†Œ ๊ฐ„๊ฒฉ๊ณผ 2 * max_dist ๋ฅผ ๋น„๊ตํ•œ๋‹ค.

๋งŒ์•ฝ ๊ฐ„๊ฒฉ์ด 2 * max_dist ๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์ด๊ฑด ํ„ฐ๋„์„ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค.
์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ํ„ฐ๋„์„ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ์ตœ๋Œ€ ์ตœ์†Œ๋ฅผ ๋‹ค์‹œ ๊ฐฑ์‹ ํ•ด์ฃผ๋Š” ๊ณผ์ •์„ ๋™๋ฐ˜ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์นด์šดํŒ…ํ•œ cnt๋ฅผ ๊ฐ€์ง€๊ณ  max ํ„ฐ๋„๊ฐœ์ˆ˜ k์™€ ๋น„๊ตํ•œ๋‹ค.
k๋ณด๋‹ค ์ปธ๋‹ค๋ฉด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์ด๋ผ false, ์•„๋‹ˆ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋‹ค์‹œ ์ด๋ถ„ํƒ์ƒ‰ ๋ฃจํ”„๋กœ ๋Œ์•„์™€์„œ ์ƒํ•˜ํ•œ์„ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.

if (check(mid)) r = mid;
else l = mid;

check๋ฅผ ํ†ต๊ณผํ•œ ๊ฑฐ๋ฉด ํ„ฐ๋„ ๊ฐœ์ˆ˜๊ฐ€ ๋„๋„ํ•œ ๊ฑฐ๋ผ ์ƒํ•œ์„ ๋‚ฎ์ถฐ์ค€๋‹ค.
max_dist๊ฐ€ ๋” ์ค„์–ด๋„ ์—ฌ์œ ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ.

๋ฐ˜๋Œ€๋กœ check๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด ํ„ฐ๋„์ด ๋” ํ•„์š”ํ•œ ์ƒํ™ฉ์ด๋ผ
ํ•˜ํ•œ์„ ๋†’์—ฌ์„œ max_dist๋ฅผ ๋Š˜๋ ค์ค€๋‹ค.

14233. ์•…๋• ์‚ฌ์žฅ

๐Ÿ”— BOJ Link

๋ฌธ์ œ์ž์ฒด๊ฐ€ ๋ญ”์†Œ๋ฆฌ์ธ์ง€ ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๋œ๋‹ค.

ํ’€์ด ์ž์ฒด๋Š” ๊ทธ๋ƒฅ Ai[i]์™€ k * (i+1)์„ ๋น„๊ตํ•˜๋Š” ๋ฌธ์ œ์ธ๋ฐ
๋‹ค์‹œ ์ฝ์–ด๋ด๋„ ๋ฌธ์ œ๊ฐ€ ์ „ํ˜€ ๊ทธ๋Ÿฐ์‹์œผ๋กœ ์ฝํžˆ์ง€ ์•Š๋Š”๋‹ค.

2512. ์˜ˆ์‚ฐ

๐Ÿ”— BOJ Link

์ฒ˜์Œ์— ์ƒํ•˜ํ•œ์„

int start = budget[0], end = budget[N-1];
// int start = 0, end = budget[N-1];

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•ด์„œ ํ•ด๋งธ๋‹ค.
์˜ˆ์‚ฐ์•ˆ์ด ์ ๊ฒŒ ์ฃผ์–ด์ง€๋Š” ๊ฑธ ๋†“์ณค๋‹ค.

mid๋ฅผ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์—†์–ด์„œ ์ด์ „ ๊ฐ’์„ ์ถ”์ ํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๋‘๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ–ˆ๋‹ค.

2110. ๊ณต์œ ๊ธฐ ์„ค์น˜

๐Ÿ”— BOJ Link

์ด๋Ÿฐ ๋ฌธ์ œ ๋Š๋‚Œ์ด๋‹ค.
์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜์œผ๋กœ bs ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ
์–ด๋–ค ๊ฐ„๊ฒฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์„œ ์ขํ˜€๋‚˜๊ฐ€๋ฉฐ ๋‹ต์„ ์ฐพ๋Š”.

1920. ์ˆ˜ ์ฐพ๊ธฐ

๐Ÿ”— BOJ Link

์˜ค๋ฆ„ ์ฐจ์ˆœ ์ •๋ ฌํ›„ ๊ฐ ์ •์ˆ˜๋งˆ๋‹ค ๋Œ๋ฉด์„œ ์ด๋ถ„ํƒ์ƒ‰ํ•˜๋ฉด ๋จ.

2467. ์šฉ์•ก

๐Ÿ”— BOJ Link

๊ทธ๋ƒฅ ๋ฌด๋‚œํ•œ ํˆฌํฌ์ธํ„ฐ


2์ฃผ์ฐจ : BFS

๋ชฉ์ฐจ

1707. ์ด๋ถ„ ๊ทธ๋ž˜ํ”„

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

๊ทธ๋ž˜ํ”„์˜ ์ •์ ๋“ค์˜ ๊ฐœ์ˆ˜ V, ๊ฐ„์„ ๋“ค์˜ ๊ฐœ์ˆ˜ E๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
๊ฐ ์ •์ ์€ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌ๋ฐ›๋Š”๋‹ค : 1, 2, ..., V

E๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
์ •๋ณด๋Š” u, v ํ˜•ํƒœ๋กœ ์ฃผ์–ด์ง„๋‹ค.

ex) V = 4, E = 4
4 4 - (V, E)
1 2
2 3
3 4
4 2

์ด ๋•Œ, ์ด๋ถ„ ๊ทธ๋ž˜ํ”„์ด๋ฉด "YES", ์•„๋‹ˆ๋ฉด "NO"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์ด๋ถ„ ๊ทธ๋ž˜ํ”„ (Bipartite Graph)๋ž€?

๊ทธ๋ž˜ํ”„์˜ ์ •์  ์ง‘ํ•ฉ์„ ๋‘ ๊ฐœ๋กœ ๋ถ„ํ• ํ–ˆ์„ ๋•Œ,
๊ฐ ์ง‘ํ•ฉ์— ์†ํ•œ ์ •์ ๋ผ๋ฆฌ๋Š” ์ธ์ ‘ํ•˜์ง€ ์•Š๋„๋ก ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„

ํ•ด์„ค

๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  vertex๋ฅผ 2๊ฐ€์ง€ ์ƒ‰๊น”๋กœ ์น ํ•˜๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•˜์ž.
์ด๋•Œ ๋ชจ๋“  edge๊ฐ€ 2๊ฐ€์ง€ ์ƒ‰๊น”์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด,
์ด๋ฅผ ์ด๋ถ„ ๊ทธ๋ž˜ํ”„๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

https://rohithv63.medium.com/graph-algorithm-bipartite-graph-dfs-f7f6a4afed4c
https://rohithv63.medium.com/graph-algorithm-bipartite-graph-dfs-f7f6a4afed4c

1. Graph ์ž…๋ ฅ๋ฐ›๊ธฐ

vector<int> graph[MAX];
 
...
 
for (int i=0; i<E; ++i) {
    cin >> n1 >> n2;
    graph[n1].push_back(n2);
    graph[n2].push_back(n1);
}

์œ„์™€ ๊ฐ™์ด vector ๋ฐฐ์—ด์„ ํ†ตํ•ด์„œ ์ž…๋ ฅ๋ฐ›๋Š” ๊ฐ„์„  ๋ฐ์ดํ„ฐ๋งˆ๋‹ค
์–‘๋ฐฉํ–ฅ์œผ๋กœ push ํ•ด์ค€๋‹ค.

2. BFS ์ง„์ž…์ „ main ํ•จ์ˆ˜

// bool ํƒ€์ž…์ด ์•„๋‹ˆ๋‹ค!
int visited[MAX];
 
...
 
for (int i=1; i<=V; ++i) {
    if (!visited[i]) bfs(i);
}
 
if (is_bipartite()) cout << "YES" << '\n';
else cout << "NO" << '\n';

1 ~ V ๊นŒ์ง€ ๋ชจ๋“  vertex๋ฅผ ์ง„์ž…์ ์œผ๋กœ ํ•ด์„œ bfs๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด ์œผ๋ ˆ ๊ทธ๋ ‡๋“ฏ์ด bfs๋ฅผ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.

bfs๋ฅผ ๋ชจ๋‘ ์ง„ํ–‰ํ•œ ํ›„, ๋งˆ์ง€๋ง‰์œผ๋กœ is_bipartite ํ˜ธ์ถœ์„ ํ†ตํ•ด
์ด๋ถ„ ๊ทธ๋ž˜ํ”„์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•œ๋‹ค.

bfs๋Š” ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์ƒ‰๊น”์„ ์น ํ•˜๋Š” ์ผ๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค.
๋‚˜๋จธ์ง€ ๋กœ์ง์€ is_bipartite ํ•จ์ˆ˜์—์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ฃผ๋ชฉํ•ด์•ผํ•  ์ง€์ ์€ visited๋ฅผ ๊ด€๋ฆฌํ• ๋•Œ
int ํƒ€์ž…์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Š” ์ƒ‰๊น” 2๊ฐœ์— ๋Œ€ํ•œ ์‹๋ณ„์ž BLACK(1), WHITE(2)์™€
๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” 0์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

3. BFS

typedef enum {
    BLACK = 1,
    WHITE
} Color;
 
void bfs(int start) {
    queue<int> q; q.push(start);
    int color = BLACK;
    visited[start] = color;
 
    while (!q.empty()) {
        int now = q.front(); q.pop();
 
        if (visited[now] == BLACK) color = WHITE;
        else if (visited[now] == WHITE) color = BLACK;
 
        for (int i=0; i < graph[now].size(); ++i) {
            int next = graph[now][i];
            if (!visited[next]) {
                visited[next] = color;
                q.push(next);
            }
        }
    }
}

๋งจ ์ฒ˜์Œ ์‹œ์ž‘์ ์€ color = BLACK(1) ์œผ๋กœ ์น ํ•œ๋‹ค.

queue๋ฅผ ์ด์šฉํ•ด์„œ bfs ๋ฃจํ”„๋ฅผ ๋Œ๋ฆด ๋•Œ

if (visited[now] == BLACK) color = WHITE;
else if (visited[now] == WHITE) color = BLACK;

์œ„์™€ ๊ฐ™์ด ์ƒ‰๊น”์„ ๋ฐ˜์ „ํ•ด์„œ ์น ํ•ด์ค€๋‹ค.
์ด๋ ‡๊ฒŒ ์น ํ•˜๋Š” ์ž‘์—…์„ ํ•ด๋†“๊ณ ๋‚˜๋ฉด ๋‹ค์Œ ์ž‘์—…์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

4. is_bipartite

bool is_bipartite() {
    for (int i=1; i<=V; ++i) {
        for (int j=0; j<graph[i].size(); ++j) {
            int n = graph[i][j];
            if (visited[i] == visited[n]) return false;
        }
    }
    return true;
}

bfs๋ฅผ ํ†ตํ•ด ๋ชจ๋“  vertex๋ฅผ ์น ํ•˜๊ณ  ๋‚˜๋ฉด
์ด์ œ ์ด๋ถ„ ๊ทธ๋ž˜ํ”„์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•  ์ž‘์—…๋งŒ ๋‚จ์•„์žˆ๋‹ค.

graph[1], graph[2], ... , graph[V] ๊นŒ์ง€ ์ˆœํšŒํ•˜๋ฉด์„œ
๊ฐ vertex์˜ ์ธ์ ‘ vertex๋“ค์„ ํ™•์ธํ•œ๋‹ค. (graph[i].size() ๋งŒํผ)

์ด๋•Œ, ์ธ์ ‘ vertex๊ฐ€ ๊ฐ™์€ ์ƒ‰๊น”์ด๋ผ๋ฉด ์ด๋ถ„ ๊ทธ๋ž˜ํ”„๊ฐ€ ์•„๋‹ˆ๋‹ค.

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
#define MAX 20001
using namespace std;
vector<int> graph[MAX];
int V, E;
int visited[MAX];
typedef enum {
    BLACK = 1,
    WHITE
} Color;
 
void bfs(int start) {
    queue<int> q; q.push(start);
    int color = BLACK;
    visited[start] = color;
    while (!q.empty()) {
        int now = q.front(); q.pop();
 
        if (visited[now] == BLACK) color = WHITE;
        else if (visited[now] == WHITE) color = BLACK;
 
        for (int i=0; i<graph[now].size(); ++i) {
            int next = graph[now][i];
            if (!visited[next]) {
                visited[next] = color;
                q.push(next);
            }
        }
    }
}
 
bool is_bipartite() {
    for (int i=1; i<=V; ++i) {
        for (int j=0; j<graph[i].size(); ++j) {
            int n = graph[i][j];
            if (visited[i] == visited[n]) return false;
        }
    }
    return true;
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    int K; cin >> K;
    while (K--) {
        cin >> V >> E;
        int n1, n2;
        for (int i=0; i<E; ++i) {
            cin >> n1 >> n2;
            graph[n1].push_back(n2);
            graph[n2].push_back(n1);
        }
 
        for (int i=1; i<=V; ++i) {
            if (!visited[i]) bfs(i);
        }
 
        if (is_bipartite()) cout << "YES" << '\n';
        else cout << "NO" << '\n';
 
        for (int i=1; i<=V; ++i) graph[i].clear();
        memset(visited, 0, sizeof(visited));
    }
    return 0;
}

1697. ์ˆจ๋ฐ”๊ผญ์งˆ

๐Ÿ”— BOJ Link

๋ฌธ์ œ ์š”์•ฝ

์ˆ˜๋นˆ์ด๋Š” ๋™์ƒ๊ณผ ์ˆจ๋ฐ”๊ผญ์งˆ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๊ฐ€ ์ˆ ๋ž˜์ด๋‹ค.

์ˆ˜๋นˆ์ด๋Š” ํ˜„์žฌ ์  N(0 โ‰ค N โ‰ค 100,000)์— ์žˆ๊ณ ,
๋™์ƒ์€ ์  K(0 โ‰ค K โ‰ค 100,000)์— ์žˆ๋‹ค.

์ˆ˜๋นˆ์ด๋Š” ๊ฑท๊ฑฐ๋‚˜ ์ˆœ๊ฐ„์ด๋™์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ˆ˜๋นˆ์ด์™€ ๋™์ƒ์˜ ์œ„์น˜ N, K๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.
์ˆ˜๋นˆ์ด๊ฐ€ ๋™์ƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์„ ๊ตฌํ•ด๋ณด์ž.

ํ•ด์„ค

1. Early Return

if (K <= N) {
    cout << N - K;
    return 0;
}

์ˆ˜๋นˆ์ด์˜ ์œ„์น˜ (N)์ด ๋™์ƒ์˜ ์œ„์น˜ (K)๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด
๊ฑท๊ธฐ๋ฅผ ํ•ด์„œ 1์นธ์”ฉ ๋’ค๋กœ ๊ฐ€๋Š” ๊ฒƒ์ด ์ตœ์„ ์ด๋‹ค.
์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” bfs๋ฅผ ๋Œ๋ฆฌ์ง€์•Š๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

2. bfs ์ง„์ž… ์ „ main

#define MAX 100001
int map[MAX];
 
...
 
bfs(N);
cout << map[K];

map[i] ๋Š”
์ˆ˜๋นˆ์ด๊ฐ€ i ์œ„์น˜์— ๋„๋‹ฌํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค.

๋™์ƒ์˜ ์œ„์น˜๊ฐ€ K๋กœ ์ฃผ์–ด์ง€๋ฏ€๋กœ,
์ •์˜์— ๋”ฐ๋ผ map[K] ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋‹ต์ด ๋  ๊ฒƒ์ด๋‹ค.

3. bfs

bool visited[MAX];
 
bool check(int x) {
    return x>=0 && x<MAX;
}
 
void bfs(int start) {
    queue<int> q; q.push(start);
    map[start] = 0; visited[start] = true;
    while (!q.empty()) {
        int now = q.front(); q.pop();
        if (now == K) break;
        
        if (check(now-1) && !visited[now-1]) {
            map[now-1] = map[now] + 1;
            visited[now-1] = true;
            q.push(now-1);
        }
 
        if (check(now+1) && !visited[now+1]) {
            map[now+1] = map[now] + 1;
            visited[now+1] = true;
            q.push(now+1);
        }
 
        if (check(now*2) && !visited[now*2]) {
            map[now*2] = map[now] + 1;
            visited[now*2] = true;
            q.push(now*2);
        }
    }
}
map[start] = 0; visited[start] = true;

์‹œ์ž‘ํ•˜๋Š” ์ง€์ ์€ ๋‹น์—ฐํžˆ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด 0์ด๋ฉฐ,
๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•˜๋ฉฐ queue ๋ฃจํ”„๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.

if (now == K) break;

๋™์ƒ์˜ ์œ„์น˜๋ฅผ ๋งŒ๋‚˜๋Š” ์ˆœ๊ฐ„ ๋ฐ”๋กœ ํƒˆ์ถœํ•œ๋‹ค.

if (check(now-1) && !visited[now-1]) {
    map[now-1] = map[now] + 1;
    visited[now-1] = true;
    q.push(now-1);
}

๋’ค๋กœ ๊ฑท๊ธฐ ๋ฅผ ํ• ๋•Œ์˜ ๋ถ€๋ถ„์„ ๊ฐ€์ ธ์™€๋ดค๋‹ค.
๋‚˜๋จธ์ง€ ์ด๋™๋ฐฉ์‹ ๋˜ํ•œ ํ๋ฆ„์€ ๋™์ผํ•˜๋‹ค.

์ „ํ˜•์ ์ธ ํ๋ฆ„์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <queue>
using namespace std;
#define MAX 100001
int N, K;
int map[MAX];
bool visited[MAX];
 
bool check(int x) {
    return x>=0 && x<MAX;
}
 
void bfs(int start) {
    queue<int> q; q.push(start);
    map[start] = 0; visited[start] = true;
    while (!q.empty()) {
        int now = q.front(); q.pop();
        if (now == K) break;
        
        if (check(now-1) && !visited[now-1]) {
            map[now-1] = map[now] + 1;
            visited[now-1] = true;
            q.push(now-1);
        }
 
        if (check(now+1) && !visited[now+1]) {
            map[now+1] = map[now] + 1;
            visited[now+1] = true;
            q.push(now+1);
        }
 
        if (check(now*2) && !visited[now*2]) {
            map[now*2] = map[now] + 1;
            visited[now*2] = true;
            q.push(now*2);
        }
    }
}
 
int main() {
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
 
    cin >> N >> K;
    if (K <= N) {
        cout << N - K;
        return 0;
    }
 
    bfs(N);
    cout << map[K];
    return 0;
}

Review

11123. ์–‘ ํ•œ๋งˆ๋ฆฌ... ์–‘ ๋‘๋งˆ๋ฆฌ...

๐Ÿ”— BOJ Link

2์ฐจ์› map์—์„œ #(์–‘)์ด ์ƒํ•˜์ขŒ์šฐ๋กœ ๋ถ™์–ด์žˆ๋Š” ์ง‘ํ•ฉ์€
๋ช‡๊ฐœ๊ฐ€ ๋‚˜์˜ค๋Š”์ง€ ๋ฌป๋Š” ์ „ํ˜•์ ์ธ ๋ฌธ์ œ์ด๋‹ค.

1194. ๋‹ฌ์ด ์ฐจ์˜ค๋ฅธ๋‹ค, ๊ฐ€์ž.

๐Ÿ”— BOJ Link

์ด๋™ํ•˜๋Š” ์‚ฌ๋žŒ์˜ ์ขŒํ‘œ๊ฐ€ ์ฃผ์–ด์ง€๊ณ  ํƒˆ์ถœํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ์ด๋™ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ.
๋‹จ์ˆœํžˆ ๋ฒฝ๋งŒ ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ , ์—ด์‡ ์™€ ๋ฌธ์˜ ์กด์žฌ๋•Œ๋ฌธ์— ๊นŒ๋‹ค๋กœ์›€์ด ๋ฐœ์ƒํ•œ๋‹ค.

struct pos {
    int y;
    int x;
};
 
struct Info {
    pos p;
    int key;
    int cnt;
};

bfs์—์„œ queue์— ๋‹ด์„ ์ •๋ณด์ธ Info ๋ฅผ ์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ–ˆ๋‹ค.

bool visited[MAX][MAX][1 << 6];

๋ฐฉ๋ฌธํ–ˆ์Œ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ visited๋Š” ์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ–ˆ๋‹ค.
์ด์œ ๋Š” ๋˜‘๊ฐ™์€ pos์— ๋„๋‹ฌํ•ด๋„ key์˜ ์ƒํƒœ์— ๋”ฐ๋ผ์„œ ๋ฐฉ๋ฌธ์—ฌ๋ถ€๊ฐ€ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ.

int bfs(pos start) {
    queue<Info> q; q.push({start, 0, 0});
    while (!q.empty()) {
        auto info = q.front(); q.pop();
        int y = info.p.y, x = info.p.x, key = info.key, cnt = info.cnt;
 
        if (map[y][x] == '1') return cnt;
 
        for (int i=0; i<4; ++i) {
            int ny = y+dy[i], nx = x+dx[i];
            if (check(ny, nx, key)) {
                if (is_key(ny ,nx)) {
                    visited[ny][nx][key] = true;
                    int shift = map[ny][nx] - 'a';
                    int nkey = key | (1 << shift);
                    q.push({{ny, nx}, nkey, cnt+1});
                }
                else if (is_door(ny, nx)) {
                    if (has_key(key, map[ny][nx])) {
                        visited[ny][nx][key] = true;
                        q.push({{ny, nx}, key, cnt+1});
                    }
                }
                else { // '.' ์ด๊ฑฐ๋‚˜ '1' ์ธ ๊ฒฝ์šฐ ('#'์€ check์—์„œ ๊ฑธ๋Ÿฌ๋ƒ„)
                    visited[ny][nx][key] = true;
                    q.push({{ny, nx}, key, cnt+1});
                }
            }
        }
    }
    return -1;
}

int๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” bfs์ด๋‹ค.

์ผ๋‹จ ํƒˆ์ถœ๊ตฌ '1'์„ ๋งŒ๋‚˜๋ฉด ๋ฐ”๋กœ cnt๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

ํ•ต์‹ฌ์€ ๋น„ํŠธ๋งˆ์Šคํ‚น์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

bool has_key(int key, char door) {
    int shift = door - 'A';
    return key & (1 << shift);
}

key๋„ ์•„๋‹ˆ๊ณ  door๋„ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ƒฅ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•˜๊ณ  queue์— pushํ•œ๋‹ค.

5014. ์Šคํƒ€ํŠธ๋งํฌ

๐Ÿ”— BOJ Link

ํ˜„์žฌ ์œ„์น˜ S, ๋ชฉํ‘œ ์œ„์น˜ G, ์ด F์ธต์ธ ๊ฑด๋ฌผ์ด ์ฃผ์–ด์ง„๋‹ค.
์œ„๋กœ U์ธต, ์•„๋ž˜๋กœ D์ธต์„ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

bool visited[MAX];
int floors[MAX];
 
...
 
cin >> F >> S >> G >> U >> D;
bfs(S);
 
if (visited[G]) cout << floors[G];
else cout << "use the stairs";

bfs๋ฅผ ์ผ๋‹จ ๋Œ๋ฆฐ๋’ค ๋ชฉํ‘œ G์ธต์— ๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ
๊ฒฐ๊ณผ ์ถœ๋ ฅํ•˜๋ฉด๋˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์ด๋‹ค.

bfs์—์„œ๋Š” U, D์— ๋”ฐ๋ผ ํ์— ํ‘ธ์‹œํ•˜๊ณ  ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

4179. ๋ถˆ!

๐Ÿ”— BOJ Link

์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ๋ถˆ์ด ํผ์ง€๋Š” ๊ฒƒ์„ ๋ฏธ๋ฆฌ fire_map์— ๋‹ด์•„๋‘๋Š” ๊ฒƒ์— ์žˆ๋‹ค.

struct pos {
    int y, x;
};
 
struct Info {
    int y, x, time;
};
 
int fire_map[MAX][MAX];
queue<pos> gq;
 
...
 
// input
for (int i=0; i<R; ++i) {
    cin >> s;
    for (int j=0; j<C; ++j) {
        map[i][j] = s[j];
        bool is_fire = false;
        if (map[i][j] == 'J') {
            start_y = i; start_x = j;
        }
        else if (map[i][j] == 'F') {
            fire_map[i][j] = 0;
            gq.push({i, j});
            is_fire = true;
        }
 
        if (!is_fire) fire_map[i][j] = INT_MAX;
    }
}

์œ„์™€ ๊ฐ™์ด ๋ถˆ์˜ ์‹œ์ž‘์ ์„ ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” gq์— ๋„ฃ์–ด์ค€๋‹ค.

is_fire ๋ผ๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด fire๊ฐ€ ์•„๋‹Œ ๊ณณ๋“ค์—๋Š” INT_MAX๋ฅผ ํ• ๋‹นํ•œ๋‹ค.
์ด๋Š” fire๊ฐ€ ํผ์ง€๋Š” ๊ณผ์ •์„ bfs๋กœ ํ‘œํ˜„ํ•  ๋•Œ
๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์Œ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒฝ๊ณ„๊ฐ’์œผ๋กœ์„œ ์ž‘์šฉํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

bool check_fire(int y, int x) {
    return y>=0 && y<R && x>=0 && x<C && map[y][x] != '#';
}
 
void bfs_fire() {
    while (!gq.empty()) {
        int size = gq.size();
        for (int s=0; s<size; ++s) {
            auto info = gq.front(); gq.pop();
            int y = info.y, x = info.x;
 
            for (int i=0; i<4; ++i) {
                int ny = y+dy[i], nx = x+dx[i];
                if (check_fire(ny, nx) && (fire_map[ny][nx] > fire_map[y][x]+1)) {
                    fire_map[ny][nx] = fire_map[y][x]+1;
                    gq.push({ny, nx});
                }
            }
        }
    }
}

๋ถˆ์ด ํผ์ง€๋Š” ๊ฒƒ์€ ํ•œ๋ฒˆ ํ์— ๋“ค์–ด์žˆ๋˜ fire๋ฅผ ๋ชจ๋‘ ๋น„์›Œ์•ผ ํ•œ๋‹ค.
์ฆ‰, ํ”ํžˆ ํ•˜๋“ฏ์ด ์•ˆ์—์„œ

for (int i=0; i<4; ++i) {
    ...
}

์ด๊ฒƒ๋งŒ ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
๋ฐ–์—์„œ ํ•œ๋ฒˆ๋” loop๋ฅผ ๋ž˜ํ•‘ํ•ด์„œ
๋˜‘๊ฐ™์€ ์‹œ๊ฐ„๋Œ€์— ๋‹ด๊ฒผ๋˜ ๋ถˆ๋“ค์€ ๋ชจ๋‘ ์†Œ๋น„๋˜๊ฒŒ๋” ํ•ด์•ผํ•œ๋‹ค.

bool check(int y, int x, int ntime) {
    return y>=0 && y<R && x>=0 && x<C && map[y][x] != '#' && !visited[y][x] && (ntime < fire_map[y][x]);
}
 
int bfs(int start_y, int start_x) {
    visited[start_y][start_x] = true;
    queue<Info> q; q.push({start_y, start_x, 0});
 
    while (!q.empty()) {
        auto info = q.front(); q.pop();
        int y = info.y, x = info.x, time = info.time;
 
        if (y == R-1 || x == C-1 || y == 0 || x == 0) return time+1;
 
        for (int i=0; i<4; ++i) {
            int ny = y+dy[i], nx = x+dx[i];
            if (check(ny, nx, time+1)) {
                visited[ny][nx] = true;
                q.push({ny, nx, time+1});
            }
        }
    }
    return 0;
}

ํ•ด๋‹น ์ขŒํ‘œ์— ๋„๋‹ฌํ–ˆ์„๋•Œ ๋ถˆ์ด ์–ด๋Š์‹œ์ ์— ๋„๋‹ฌํ•˜๋Š”์ง€ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•œ
fire_map ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
์ง€ํ›ˆ์ด๋ฅผ ์ด๋™์‹œํ‚ค๋ฉฐ bfs ๋Œ๋ฆฌ๋Š” ๊ฒƒ์€ ์ด์ œ ์‰ฌ์›Œ์ง„๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด, ํ์— ๋“ค์–ด์žˆ๋˜ time์— 1์„ ๋”ํ•œ ๊ฐ’์ด
fire_map[ny][nx] ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด
๋ถˆ์ด ํผ์ง€๊ธฐ ์ „์— ๋„๋‹ฌํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ๊ดœ์ฐฎ๋‹ค๋Š” ๋œป์ด๋‹ค.

2074. ๊ฑฐ๋“ญ์ œ๊ณฑ ๊ณ„์‚ฐํ•˜๊ธฐ

๐Ÿ”— BOJ Link

๊ฒฐ๊ตญ ํ’€์ง€ ๋ชปํ–ˆ๋‹ค.
์˜์–ด๋กœ ๊ฒ€์ƒ‰ํ•ด๋ณธ ๊ฒฐ๊ณผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธ€๋“ค์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

p1, p2๊ฐ€ 20101, 97๋กœ ์„ค์ •ํ•ด์„œ bool hash[p1][p2]๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ
๊ทธ๋ƒฅ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.
์‹ฌ์ง€์–ด boj์—์„œ ๋‹ต๋„ ํ†ต๊ณผ๋˜์ง€ ์•Š๋Š”๋‹ค.

1325. ํšจ์œจ์ ์ธ ํ•ดํ‚น

๐Ÿ”— BOJ Link

vector<int> map[MAX];
 
...
 
for (int i=0; i<M; ++i) {
    cin >> a >> b;
    map[b].push_back(a); // b๋ฅผ ํ•ดํ‚นํ•˜๋ฉด a๋ฅผ ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ๋‹ค
}

๊ฒฐ๊ตญ์€ a, b ์ˆœ์„œ๋กœ ์ž…๋ ฅ์ด ๋“ค์–ด์˜ค์ง€๋งŒ
b๋ฅผ ํ•ดํ‚นํ•˜๋ฉด a๋ฅผ ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋ฏ€๋กœ ์ˆœ์„œ๋ฐ”๊ฟ”์„œ map์— ํ‘ธ์‹œํ•œ๋‹ค.

bool visited[MAX];
int max_val = 0;
int dfs_val;
 
...
 
void dfs(int cur) {
    for (int j=0; j<map[cur].size(); ++j) {
        int next = map[cur][j];
        if (!visited[next]) {
            visited[next] = true;
            ++dfs_val;
            dfs(next);
        }
    }
}
 
...
 
vector<int> ans;
 
for (int i=1; i<=N; ++i) {
    if (map[i].empty()) continue;
    memset(visited, false, sizeof(visited));
    visited[i] = true;
    dfs_val = 0;
    dfs(i);
 
    if (dfs_val > max_val) {
        ans.clear();
        ans.push_back(i);
        max_val = dfs_val;
    }
    else if (dfs_val == max_val) {
        ans.push_back(i);
    }
}

์ผ๋ฐ˜์ ์ธ ํ๋ฆ„์ด๋‹ค.
dfs_val ์„ ํ†ตํ•ด ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํ“จํ„ฐ์˜ ์ˆ˜๋ฅผ ์„ผ๋‹ค.

์ด๊ฒŒ max_val ๋ณด๋‹ค ์ปธ๋‹ค๋ฉด ans ๋ฒกํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ํ‘ธ์‹œ,
๊ฐ™๋‹ค๋ฉด ๊ทธ๋ƒฅ ํ‘ธ์‹œ,
์ž‘๋‹ค๋ฉด ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.