๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/BOJ

[BOJ] ํ•˜๋…ธ์ด ํƒ‘ ์ด๋™ ์ˆœ์„œ(11729)

[๋ฐฑ์ค€(BOJ)] 11729_ํ•˜๋…ธ์ด ํƒ‘ ์ด๋™ ์ˆœ์„œ C++

๋ฌธ์ œ : BOJ_11729๋ฒˆ ํ•˜๋…ธ์ด ํƒ‘ ์ด๋™ ์ˆœ์„œ

๋ฌธ์ œ ์„ค๋ช…

์žฌ๊ท€

์žฌ๊ท€ ๋ฌธ์ œ๋กœ ์œ ๋ช…ํ•œ ํ•˜๋…ธ์ด ํƒ‘ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

n์„ ์ž…๋ ฅ๋ฐ›์œผ๋ฉด ์„ธ ๊ฐœ์˜ ์žฅ๋Œ€ ์ค‘ ์ฒซ ๋ฒˆ์งธ ์žฅ๋Œ€์— n ๊ฐœ์˜ ํƒ‘์ด ์Œ“์ด๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

n ๊ฐœ์˜ ํƒ‘์€ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ์›ํŒ์ด ๊ฐ€์žฅ ๊ฐ€๋ณ๊ณ  ์•„๋ž˜๋กœ ๊ฐˆ์ˆ˜๋ก ๋ฌด๊ฑฐ์šด ์›ํŒ์ด๋ฉฐ, ๊ฐ€๋ฒผ์šด ์›ํŒ ์œ„์— ๋ฌด๊ฑฐ์šด ์›ํŒ์ด ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ ์žฅ๋Œ€ ์ค‘ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ์›ํŒ์„ ํ•˜๋‚˜ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์„ 1ํšŒ๋กœ ํ•  ๋•Œ, ์ตœ์ดˆ์— ์ฒซ ๋ฒˆ์งธ ์žฅ๋Œ€์— ์žˆ์—ˆ๋˜ ์›ํŒ์„ ๋ชจ๋‘ ์„ธ ๋ฒˆ์งธ ์›ํŒ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ์ตœ์†Œ ์ด๋™ ํšŒ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.


Solution

ํ˜„์žฌ ์žฅ๋Œ€์˜ ์œ„์น˜๋ฅผ st, ์ด๋™ํ•ด์•ผ ํ•˜๋Š” ์žฅ๋Œ€์˜ ์œ„์น˜๋ฅผ ed, ๋‚˜๋จธ์ง€ ์žฅ๋Œ€๋ฅผ mid๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค.

์ฒ˜์Œ์— n์„ 3์ด๋ผ๊ณ  ์ž…๋ ฅํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ ์žฅ๋Œ€์— 3๊ฐœ์˜ ์›ํŒ์ด ๋†“์—ฌ ์žˆ๋Š” ์ƒํ™ฉ์ด ๋˜๊ณ , ์ด ์›ํŒ์„ ๋ชจ๋‘ 3๋ฒˆ์งธ ์›ํŒ์— ์˜ฎ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๋ฌด๊ฑฐ์šด 3๋ฒˆ์งธ ์›ํŒ์„ 3๋ฒˆ์งธ ์žฅ๋Œ€์— ์˜ฎ๊ธฐ๋ ค๋ฉด 3๋ฒˆ์งธ ์›ํŒ์— ์žˆ๋Š” ๋ชจ๋“  ์›ํŒ์„ ๋‹ค๋ฅธ ์žฅ๋Œ€๋กœ ์ด๋™์‹œ์ผœ์•ผ ํ•˜๊ณ , 3๋ฒˆ์งธ ์žฅ๋Œ€๋Š” ๋น„์–ด์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, 3๋ฒˆ์งธ ์›ํŒ ์œ„์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ์ƒํƒœ + ๋‚˜๋จธ์ง€ ์›ํŒ์€ ๋ชจ๋‘ 2๋ฒˆ์œผ๋กœ ์˜ฎ๊ฒจ์ง„ ์ƒํƒœ๋ฅผ ์ถฉ์กฑํ•˜๋ฉด 3๋ฒˆ์งธ ์›ํŒ์„ 3๋ฒˆ ์žฅ๋Œ€๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๊ณ , 3๋ฒˆ์งธ ์›ํŒ์„ 3๋ฒˆ ์žฅ๋Œ€๋กœ ์˜ฎ๊ธด ๋’ค 2๋ฒˆ ์žฅ๋Œ€์— ์žˆ๋˜ ๋ชจ๋“  ์›ํŒ์„ ๋‹ค์‹œ 3๋ฒˆ ์žฅ๋Œ€๋กœ ์˜ฎ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์žฌ๊ท€์ ์ธ ์ƒํ™ฉ์œผ๋กœ ๋‹ค์‹œ ์ •๋ฆฌํ•˜๋ฉด,

  • ๊ฐ€์žฅ ๋ฌด๊ฑฐ์šด ์›ํŒ์„ ์ œ์™ธํ•œ n-1๊ฐœ์˜ ์›ํŒ์„ mid๋กœ ์˜ฎ๊น€
  • ๊ฐ€์žฅ ๋ฌด๊ฑฐ์šด ์›ํŒ์„ ed๋กœ ์˜ฎ๊น€
  • ์ฒซ ๋ฒˆ์งธ ๊ณผ์ •์—์„œ ์˜ฎ๊ฒผ๋˜ n-1๊ฐœ์˜ ์›ํŒ์„ ed๋กœ ์˜ฎ๊น€

์ด๋ฅผ ์žฌ๊ท€๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Description

  • ์ „์ฒด ์˜ฎ๊ธด ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์˜ฎ๊ฒจ์ง„ ์›ํŒ์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๊ฐ ์›ํŒ์˜ ์ด๋™๊ฒฝ๋กœ๋ฅผ queue<pair<int, int>> q์— ๋‹ด๊ณ , q.size()๋ฅผ ์ถœ๋ ฅํ•œ ๋’ค q์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ์žฅ๋Œ€์˜ ์œ„์น˜๋ฅผ 1, ๋‘ ๋ฒˆ์งธ๋Š” 2, 3๋ฒˆ์งธ๋Š” 3์œผ๋กœ ์žก์œผ๋ฉด mid = 6 - st - ed๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ์žฌ๊ท€์˜ ๊ธฐ์ € ์กฐ๊ฑด์€ ํ˜„์žฌ ์›ํŒ ๋ฒˆํ˜ธ๊ฐ€ 1์ผ ๋•Œ ๊ฐ€์žฅ ๊ฐ€๋ฒผ์šด ์›ํŒ์ด๋ฏ€๋กœ ์ด ์ƒํ™ฉ์—์„  ๋ฐ”๋กœ ed๋กœ ์ด๋™ํ•ด ์ฃผ๊ณ  ์ด๋ฅผ ํ์— ๋‹ด๊ณ  ์žฌ๊ท€๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

#include <iostream>
#include <queue>
using namespace std;
queue <pair<int,int>> q;
void recursion(int idx, int st, int ed);
int main() {
    int n;
    cin >> n;
    recursion(n, 1, 3);
    cout << q.size() << '\n';
    while (!q.empty()) {
        cout << q.front().first << ' ' << q.front().second << '\n';
        q.pop();
    }
    return 0;
}
void recursion(int idx, int st, int ed){
    if(idx==1){
        q.push({st,ed});
        return;
    }
    int mid = 6-st-ed;
    recursion(idx-1,st,mid);
    q.push({st,ed});
    recursion(idx-1,mid,ed);
}