๊ณจ๋“œ2 : ์œ ๋‹ˆ์–ธ ํŒŒ์ธ๋“œ ๋ฌธ์ œ์ด๋‹ค.

์ƒ๊ฐ

์ด๋Ÿฐ ๋ฌธ์ œ๋Š” ์ •๋ง ๋น„ํ–‰๊ธฐ๊ฐ€ ์˜จ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ํ‘ธ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋ชจ๋“  ๋ฌธ์ œ๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ œ๋Œ€๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”.. ์ด 5๊ฐœ์˜ ๊ฒŒ์ดํŠธ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ ๋•Œ, 4๋ฒˆ์œผ๋กœ ๋น„ํ–‰๊ธฐ๊ฐ€ ๋“ค์–ด์˜จ๋‹ค. ๊ทธ๋Ÿผ 4๋ฒˆ์— ๋ฐฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ๋งž๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋˜ 4๋ฒˆ์œผ๋กœ ๋“ค์–ด์˜จ๋‹ค. ์ด ๋ฌธ์ œ๋Š” 4๋ฒˆ ๋ณด๋‹ค ์ž‘์€ ๊ฒŒ์ดํŠธ์—๋งŒ ๋น„ํ–‰๊ธฐ๊ฐ€ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒŒ์ดํŠธ๋Š” 1, 2, 3์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๋ฌธ์ œ ํŠน์ง• ์ƒ ์›ํ•˜๋Š” ๊ฒŒ์ดํŠธ๋ณด๋‹ค ์ž‘์€ ๋ถ€๋ถ„์—๋งŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€์žฅ ๋งŽ์€ ๋น„ํ–‰๊ธฐ๋ฅผ ๋„ฃ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์›ํ•˜๋Š” ๊ฒŒ์ดํŠธ์—์„œ ์ž‘์€ ์ˆซ์ž๋ฅผ ๊ฐ€์ง„ ๊ฒŒ์ดํŠธ ์ค‘, ์ˆซ์ž๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ฒŒ์ดํŠธ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์ตœ์„ ์ด๋‹ค.(์‘?) ์ดํ•ด๋ฅผ ์œ„ํ•ด ํ‘œ๋ฅผ ๊ทธ๋ ค๋ณด์ž.

|gate|1|2|3|4|5| |:โ€”:|:|:|:|:|:| ||0|0|0|1|0|

์ด ์ƒํ™ฉ์—์„œ 3๋ฒˆ ๊ฒŒ์ดํŠธ๋กœ ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ ๋‘๊ฐ€์ง€ ๊ทธ๋ฆผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

|gate|1|2|3|4|5| |:โ€”:|:|:|:|:|:| ||1|0|0|1|0|

|gate|1|2|3|4|5| |:โ€”:|:|:|:|:|:| ||0|0|1|1|0|

1๋ฒˆ ํ‘œ์˜ ๊ฒฝ์šฐ, ๋งŒ์•ฝ 1๋ฒˆ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋น„ํ–‰๊ธฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด, ์ด ๋น„ํ–‰๊ธฐ๋Š” ์ด๋ฏธ ๊ฒŒ์ดํŠธ๊ฐ€ ์ฐจ ์žˆ์œผ๋ฏ€๋กœ ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ์ˆซ์ž๋Š” 2์ด๋‹ค. 2๋ฒˆ ํ‘œ์—์„œ๋Š” 1๋ฒˆ ๊ฒŒ์ดํŠธ๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฏ€๋กœ ๋น„ํ–‰๊ธฐ๋ฅผ ๋Œˆ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์ •๋‹ต์€ 3์ด๋‹ค. ์ด๋ ‡๊ฒŒ, ๋น„ํ–‰๊ธฐ๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ์›ํ•˜๋Š” ๊ฒŒ์ดํŠธ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒŒ์ดํŠธ ์ค‘ ๋น„์–ด์žˆ๋Š” ๊ฒŒ์ดํŠธ์—์„œ ๊ฐ€์žฅ ํฐ ์ˆซ์ž๋ฅผ ๊ฐ€์ง„ ๊ฒŒ์ดํŠธ ์ˆœ์„œ๋กœ ๋„ํ‚นํ•ด์•ผํ•œ๋‹ค.

์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ

์œ„์—์„œ ์ƒ๊ฐํ•œ ๊ฒƒ์€, ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์ด ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ๋Š” ๊ทธ๋ž˜ํ”„๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

gate     : 1, 2, 3, 4, 5
airplain : 4, 4, 3, 1

์œ„์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๋น„ํ–‰๊ธฐ๊ฐ€ ๋“ค์–ด์˜จ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ์˜ ๊ทธ๋ฆผ์„ ๋ณด์ž.

airplain 4

airplain 4

airplain 3

airplain 1

์ด ๊ณผ์ •์—์„œ, ์‹ ๊ฒฝ์จ์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์€, ํ•ด๋‹น ๊ฒŒ์ดํŠธ์˜ ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋ฌด์—‡์ธ์ง€์ด๋‹ค! ๋ฌด์กฐ๊ฑด ์ฒ˜์Œ์—๋Š” ๋น„ํ–‰๊ธฐ๊ฐ€ ์™”์„ ๋•Œ, ์ž์‹ ์˜ ๊ฒŒ์ดํŠธ์— ๋„ฃ๋Š” ๊ฒƒ์€ ํ™•์ •์ด๋ฏ€๋กœ, ์ฒ˜์Œ ๋„ํ‚น ์œ„์น˜์˜ ์ดˆ๊ธฐ๊ฐ’์€ ์ž๊ธฐ ์ž์‹ ์˜ ๊ฒŒ์ดํŠธ ์ด๋‹ค. ์ด์ œ ๋น„ํ–‰๊ธฐ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด์„œ, ์–ด๋– ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๊ฒƒ์„ ์—…๋ฐ์ดํŠธ ํ•ด์ค„์ง€ ๊ณ ๋ฏผํ•˜๋ฉด ๋œ๋‹ค.

๋Œ€์•ˆ ๊ฒŒ์ดํŠธ ํ•ฉ์น˜๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ์˜ ์œ„์น˜๋Š” ๋‚˜๋ณด๋‹ค ํ•˜๋‚˜ ์ž‘์€ ๋…€์„์˜ ๊ฒŒ์ดํŠธ์ด๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์œ„์น˜์—๋„ ์ด๋ฏธ ๋„ํ‚น์ด ๋˜์–ด ์žˆ๋‹ค๋ฉด, ๊ทธ ๋…€์„์˜ ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ๋ฅผ ๋˜ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ๋ฅผ ์ฐพ์•„์„œ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ๋Š” ๋‚˜๋ณด๋‹ค ์ž‘์€ ๋…€์„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋˜, ๊ทธ๋…€์„์˜ ์ตœ์ข…์ ์ธ ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ด ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ๋Š” ์กฐ์ƒ์— ์น˜ํ™˜๋˜๋Š” ๊ฐœ๋…์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ฒฐ๊ตญ์€ ์กฐ์ƒ์„ ์ฐพ์•„์„œ, ๊ทธ ์กฐ์ƒ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

์ข…๋ฃŒ์กฐ๊ฑด์€ ๊ฐ„๋‹จํ•˜๋‹ค. ๋ฌธ์ œ์—์„œ ๋ณด์—ฌ์ฃผ๋“ฏ ์›ํ•˜๋Š” ๊ฒŒ์ดํŠธ๋ณด๋‹ค ์ž‘์€ ๊ฒŒ์ดํŠธ๋“ค์ด ๋‹ค ๋„ํ‚น์ด ๋œ ์ƒํƒœ๋ฉด ์ข…๋ฃŒํ•œ๋‹ค. ์ด ์กฐ๊ฑด์€, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ƒ์—์„œ ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ์˜ ๋ฒˆํ˜ธ๊ฐ€ 0์ด ๋˜๋Š” ๊ฒƒ๊ณผ ๋™์น˜์ด๋‹ค. 0๋ฒˆ ๊ฒŒ์ดํŠธ๋Š” ์—†์œผ๋ฏ€๋กœ ๋„ํ‚นํ•  ์ˆ˜ ์—†๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜

  1. ์ดˆ๊ธฐ ๊ฒŒ์ดํŠธ์˜ ์œ„์น˜๋ฅผ ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ž๊ธฐ์ž์‹ ์˜ ๊ฒŒ์ดํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค.
  2. ๋น„ํ–‰๊ธฐ๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ, ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ๋ฅผ ์ฐพ๋Š”๋‹ค.
  3. ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ๋ฅผ ์ฐพ์œผ๋ฉด, ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ์— ๋น„ํ–‰๊ธฐ๊ฐ€ ๋„ํ‚นํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋„ํ‚นํ•œ ๋น„ํ–‰๊ธฐ์˜ ์ˆซ์ž๋ฅผ ๋Š˜๋ฆฐ๋‹ค.
  4. ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ์— ๋น„ํ–‰๊ธฐ๊ฐ€ ๋“ค์–ด์™”์œผ๋ฏ€๋กœ, ๋ฐฉ๊ธˆ ๋„ํ‚นํ•œ ๋น„ํ–‰๊ธฐ์˜ ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ๋ฅผ ์ฐพ๋Š”๋‹ค.
  5. ๋งŒ์•ฝ, ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ์˜ ๋ฒˆํ˜ธ๊ฐ€ 0์ธ ๊ฒฝ์šฐ ํ˜„์žฌ๊นŒ์ง€ ๋„ํ‚นํ•œ ๋น„ํ–‰๊ธฐ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.

Code

#include <iostream>
using namespace std;
int n, m;
int parent[100001];
int ans = 0;
 
int find(int gate){
    if (gate == parent[gate]){
        return gate;
    }
    return parent[gate] = find(parent[gate]);
     // ํƒ์ƒ‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ์žˆ์—ˆ๋˜ ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ๋ฅผ ์ตœ์ข… ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
}
 
// ๊ฒŒ์ดํŠธ์˜ ์ตœ์ข… ๋Œ€์•ˆ ๊ฒŒ์ดํŠธ๋กœ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
void unite(int x, int y) {
    x = find(x);
    y = find(y);
    parent[x] = y;
}
 
int main(){
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        parent[i] = i;
    }
    for (int i = 0; i < m; i++) {
        int command;
        cin >> command;
        int empty_gate = find(command);
        if (empty_gate == 0) {
            break;
        }
        ans++;
        unite(empty_gate, empty_gate-1); // ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚˜๋ณด๋‹ค ํ•˜๋‚˜ ์ž‘์€ ๊ฒŒ์ดํŠธ์™€ ํ•ฉ์นœ๋‹ค.
    }
    cout << ans << '\n';
    return 0;
}

Reference