[c++] BOJ 2250 :: ํŠธ๋ฆฌ์˜ ๋†’์ด์™€ ๋„ˆ๋น„

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

๊ฑธ๋ฆฐ ์‹œ๊ฐ„ : 1์‹œ๊ฐ„

 

๋ฌธ์ œ

ํŠธ๋ฆฌ์˜ ๋†’์ด์™€ ๋„ˆ๋น„ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ด์ง„ํŠธ๋ฆฌ๋ฅผ ๋‹ค์Œ์˜ ๊ทœ์น™์— ๋”ฐ๋ผ ํ–‰๊ณผ ์—ด์— ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด์žˆ๋Š” ๊ฒฉ์ž ๋ชจ์–‘์˜ ํ‹€ ์†์— ๊ทธ๋ฆฌ๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋•Œ ๋‹ค์Œ์˜ ๊ทœ์น™์— ๋”ฐ๋ผ ๊ทธ๋ฆฌ๋ ค๊ณ  ํ•œ๋‹ค.

  1. ์ด์ง„ํŠธ๋ฆฌ์—์„œ ๊ฐ™์€ ๋ ˆ๋ฒจ(level)์— ์žˆ๋Š” ๋…ธ๋“œ๋Š” ๊ฐ™์€ ํ–‰์— ์œ„์น˜ํ•œ๋‹ค.
  2. ํ•œ ์—ด์—๋Š” ํ•œ ๋…ธ๋“œ๋งŒ ์กด์žฌํ•œ๋‹ค.
  3. ์ž„์˜์˜ ๋…ธ๋“œ์˜ ์™ผ์ชฝ ๋ถ€ํŠธ๋ฆฌ(left subtree)์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์€ ํ•ด๋‹น ๋…ธ๋“œ๋ณด๋‹ค ์™ผ์ชฝ์˜ ์—ด์— ์œ„์น˜ํ•˜๊ณ , ์˜ค๋ฅธ์ชฝ ๋ถ€ํŠธ๋ฆฌ(right subtree)์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์€ ํ•ด๋‹น ๋…ธ๋“œ๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ์˜ ์—ด์— ์œ„์น˜ํ•œ๋‹ค.
  4. ๋…ธ๋“œ๊ฐ€ ๋ฐฐ์น˜๋œ ๊ฐ€์žฅ ์™ผ์ชฝ ์—ด๊ณผ ์˜ค๋ฅธ์ชฝ ์—ด ์‚ฌ์ด์—” ์•„๋ฌด ๋…ธ๋“œ๋„ ์—†์ด ๋น„์–ด์žˆ๋Š” ์—ด์€ ์—†๋‹ค.

์ด์™€ ๊ฐ™์€ ๊ทœ์น™์— ๋”ฐ๋ผ ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ๊ทธ๋ฆด ๋•Œ ๊ฐ ๋ ˆ๋ฒจ์˜ ๋„ˆ๋น„๋Š” ๊ทธ ๋ ˆ๋ฒจ์— ํ• ๋‹น๋œ ๋…ธ๋“œ ์ค‘ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์œ„์น˜ํ•œ ๋…ธ๋“œ์˜ ์—ด ๋ฒˆํ˜ธ์—์„œ ๊ฐ€์žฅ ์™ผ์ชฝ์— ์œ„์น˜ํ•œ ๋…ธ๋“œ์˜ ์—ด ๋ฒˆํ˜ธ๋ฅผ ๋บ€ ๊ฐ’ ๋”ํ•˜๊ธฐ 1๋กœ ์ •์˜ํ•œ๋‹ค. ํŠธ๋ฆฌ์˜ ๋ ˆ๋ฒจ์€ ๊ฐ€์žฅ ์œ„์ชฝ์— ์žˆ๋Š” ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ 1์ด๊ณ  ์•„๋ž˜๋กœ 1์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ฃผ์–ด์ง„ ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ์œ„์˜ ๊ทœ์น™์— ๋”ฐ๋ผ ๊ทธ๋ฆด ๋•Œ์— ๋„ˆ๋น„๊ฐ€ ๊ฐ€์žฅ ๋„“์€ ๋ ˆ๋ฒจ๊ณผ ๊ทธ ๋ ˆ๋ฒจ์˜ ๋„ˆ๋น„๋ฅผ ๊ณ„์‚ฐํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ์˜ ์˜ˆ์—์„œ ๋„ˆ๋น„๊ฐ€ ๊ฐ€์žฅ ๋„“์€ ๋ ˆ๋ฒจ์€ 3๋ฒˆ์งธ์™€ 4๋ฒˆ์งธ๋กœ ๊ทธ ๋„ˆ๋น„๋Š” 18์ด๋‹ค. ๋„ˆ๋น„๊ฐ€ ๊ฐ€์žฅ ๋„“์€ ๋ ˆ๋ฒจ์ด ๋‘ ๊ฐœ ์ด์ƒ ์žˆ์„ ๋•Œ๋Š” ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๋ ˆ๋ฒจ์„ ๋‹ต์œผ๋กœ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด ์˜ˆ์— ๋Œ€ํ•œ ๋‹ต์€ ๋ ˆ๋ฒจ์€ 3์ด๊ณ , ๋„ˆ๋น„๋Š” 18์ด๋‹ค.

์ž„์˜์˜ ์ด์ง„ํŠธ๋ฆฌ๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์งˆ ๋•Œ ๋„ˆ๋น„๊ฐ€ ๊ฐ€์žฅ ๋„“์€ ๋ ˆ๋ฒจ๊ณผ ๊ทธ ๋ ˆ๋ฒจ์˜ ๋„ˆ๋น„๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค

 

ํ’€์ด

  • ๊ฐ ๋…ธ๋“œ์˜ ์—ด์„ ๊ตฌํ•˜๋ ค๋ฉด ํŠธ๋ฆฌ๋ฅผ ์ค‘์œ„์ˆœํšŒํ•˜๋ฉด ๋œ๋‹ค.

 

์ฝ”๋“œ

#include <iostream>
#include <vector>

using namespace std;

struct Node {
    int data;
    Node* leftChild = nullptr;
    Node* rightChild = nullptr;
    Node* rootNode = nullptr;
    Node(int d) {
        int data = d;
    }
};

Node* nodeArr[10001];
int nowPos = 1; // ํ˜„์žฌ ์—ด
int level = 0; // ํ˜„์žฌ ๋ ˆ๋ฒจ
int maxLevel = 0; // ์ตœ๋Œ€ ๋ ˆ๋ฒจ ์ €์žฅ
int root = 0; // ๋ฃจํŠธ ๋…ธ๋“œ idx ์ €์žฅ
vector<vector<int>> width(10001, vector<int>()); // ๊ฐ ๋ ˆ๋ฒจ์˜ ์—ด ์ €์žฅ

void Inorder(Node* nodePtr) {
    if (level > maxLevel)
        maxLevel = level;

    if (nodePtr->leftChild != nullptr) {
        level++;
        Inorder(nodePtr->leftChild);
        level--;
    }
    width[level].push_back(nowPos++);
    if (nodePtr->rightChild != nullptr) {
        level++;
        Inorder(nodePtr->rightChild);
        level--;
    }
}

Node* findRoot(Node* nodePtr) { // rootNode๋ฅผ ์ €์žฅํ•˜์—ฌ ์œ„๋กœ ํƒ€๊ณ  ์˜ฌ๋ผ๊ฐ€๊ธฐ
    while (nodePtr->rootNode != nullptr) {
        nodePtr = nodePtr->rootNode;
    }
    return nodePtr;
}

int main() {
    // 50๋ถ„
    // ์ค‘์œ„ ์ˆœํšŒ!, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ

    int N; cin >> N;

    Node* head;
    for (int i = 1; i <= N; i++) { // ๋…ธ๋“œ ์‚ฝ์ž…
        Node* newNode = new Node(i);
        newNode->data = i;
        nodeArr[i] = newNode;
    }


    for (int i = 1; i <= N; i++) { // ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ
        int n, l, r; cin >> n >> l >> r;
        Node* node = nodeArr[n];
        if (l != -1) {
            node->leftChild = nodeArr[l];
            nodeArr[l]->rootNode = node;
        }
        if (r != -1) {
            node->rightChild = nodeArr[r];
            nodeArr[r]->rootNode = node;
        }
    }

    Node* rootNode = findRoot(nodeArr[1]); // root๋Š” ์ฒซ๋ฒˆ์งธ๋กœ ์ฃผ์–ด์ง„ ๋…ธ๋“œ๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ์Œ
    Inorder(rootNode);

    int maxResult = 0; int resultLv = 0;
    for (int i = 1; i <= maxLevel; i++) {
        int tmpWidth = width[i][width[i].size() - 1] - width[i][0];
        if (tmpWidth > maxResult) {
            maxResult = tmpWidth;
            resultLv = i;
        }
    }
    cout << resultLv+1 << " " << maxResult+1;
}

 

์ฃผ์˜ํ•  ์ 

  • ํ•ญ์ƒ ์ดˆ๊ธฐํ™”, ์ฒ˜์Œ ๊ฐ’์ด ์ž˜ ๋“ค์–ด๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์—ฌ๊ธฐ์—์„œ๋Š” ๋…ธ๋“œ๊ฐ€ ๊ฐ ๋ ˆ๋ฒจ์— ํ•˜๋‚˜๋ฐ–์— ์—†์„ ๋•Œ width๊ฐ€ 1์ด ๋จ์„ ๋งŒ์กฑ ํ•ด์•ผํ•œ๋‹ค.
  • ์ฒซ๋ฒˆ์งธ๋กœ ์ฃผ์–ด์ง„ ๋…ธ๋“œ๊ฐ€ root node๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ฒฐ๊ณผ

์•„์ด๋”” ๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„ ์–ธ์–ด ์ฝ”๋“œ ๊ธธ์ด
gmldms784 2868 12 C++17 / ์ˆ˜์ • 1661
๋ฐ˜์‘ํ˜•