[c++] BOJ 18240 :: ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ๋ณต์›ํ•˜๊ธฐ

๋‚œ์ด๋„ : ๊ณจ๋“œ 2

๋ฌธ์ œ

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ๋ณต์›ํ•˜๊ธฐ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ๋ชจ๋“  ์ •์ˆ˜๋ฅผ ํ•œ ๋ฒˆ์”ฉ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์ˆ˜์—ด A1, A2, ..., AN์ด ์žˆ๋‹ค.

๊ฐ’์ด A1์ธ ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ํŠธ๋ฆฌ์— A2, A3, ..., AN ์„ ์ˆœ์„œ๋Œ€๋กœ ์‚ฝ์ž…ํ•˜๋ ค ํ•œ๋‹ค.

N-1๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ๋งˆ๋‹ค ๋ฃจํŠธ์—์„œ ๊ทธ ๋…ธ๋“œ์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ๊ฐ„์„ ์˜ ์ˆ˜, ์ฆ‰ ๋…ธ๋“œ์˜ ๊นŠ์ด๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ A1, A2, ..., AN์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

ํ’€์ด

  • ๊ฐ’ ๋ฐ›์œผ๋ฉด์„œ 2N(n-1)<N(n) ์ธ์ง€ ์ฒดํฌ
    • N(x) : x level์˜ ๋…ธ๋“œ ์ˆ˜
    • ๋งž์œผ๋ฉด ํŠธ๋ฆฌ ์ƒ์„ฑ ๋ถˆ๊ฐ€์ด๋ฏ€๋กœ -1 ๋ฐ˜ํ™˜
    • ์™ผ์ชฝ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ ์ƒ์„ฑ (index ์ด์šฉ)
  • ์ค‘์œ„์ˆœํšŒํ•˜๋ฉด์„œ result[index]์— value ์ €์žฅ
  • result ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ

์ฝ”๋“œ

#include <iostream>
#include <vector>

using namespace std;

struct Node {
   int index;
   vector<Node*> children;

   Node(int idx) {
      index = idx;
   }
};

vector<vector<Node*>> tree(300001, vector<Node*>());
int result[300001];


int idx = 1;
void Inorder(Node* head) {
   if (head->children.size() > 0) {
      // ์™ผ์ชฝ ์ž์‹ ์กด์žฌ
      Inorder(head->children[0]);
   }
   result[head->index] = idx++;
   if (head->children.size() > 1) {
      // ์˜ค๋ฅธ์ชฝ ์ž์‹ ์กด์žฌ
      Inorder(head->children[1]);
   }
}

int main() {
   // ๋…ธ๋“œ์˜ ๊นŠ์ด(depth)๋Š” 2^depth๊ฐœ ๋งŒํผ๋งŒ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค
   // 1. ๊ฐ’ ๋ฐ›์œผ๋ฉด์„œ 2N(n-1)<N(n) ์ธ์ง€ ์ฒดํฌ => ๋งž์œผ๋ฉด ํŠธ๋ฆฌ ์ƒ์„ฑ ๋ถˆ๊ฐ€ -1
   // 2. ์™ผ์ชฝ ํฌํ™” ์ด์ง„ ํŠธ๋ฆฌ ์ƒ์„ฑ (index ์ด์šฉ, value ๋นˆ ๊ฐ’)
   // 3. ์ค‘์œ„์ˆœํšŒ๋กœ value ์ฑ„์šฐ๊ธฐ => ์ฑ„์šฐ๋ฉด์„œ result[index]์— value ์ €์žฅ
   // 4. result ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ

   int N; cin >> N;

   int index = 0;
   Node* head = new Node(++index);

   tree[0].push_back(head);

   for (int i = 0; i < N - 1; i++) {
      int level; cin >> level;

      Node* tmp = new Node(++index);

      int insertIdx = tree[level].size();
      if (tree[level - 1].size() < (insertIdx / 2) + 1) {
         cout << -1;
         return 0; // ์ •์ƒ ์ข…๋ฃŒ
      }
      tree[level].push_back(tmp);
      tree[level - 1][insertIdx/2]->children.push_back(tmp);
   }

   Inorder(head);

   for (int i = 1; i <= N; i++) {
      cout << result[i] << " ";
   }
}

๊ฐœ์„ 

์ฝ”๋“œ๊ฐ€ ๊ธธ๋‹ค๊ธธ์–ด..

๊ฒฐ๊ณผ

์•„์ด๋”” ๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„ ์ฝ”๋“œ ๊ธธ์ด
gmldms784 52212 248 1423
๋ฐ˜์‘ํ˜•