[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ธธ์ฐพ๊ธฐ๊ฒŒ์ž„ :: c++, ์ฝ”๋“œ, ํŠธ๋ฆฌ

 

๊ธธ ์ฐพ๊ธฐ ๊ฒŒ์ž„

โ˜…โ˜…โ˜…โ˜†โ˜† LEVEL 3

 

๋ฌธ์ œ

๊ธธ ์ฐพ๊ธฐ ๊ฒŒ์ž„ ๋ฌธ์ œ ๋งํฌ

๋ฌธ์ œ ์„ค๋ช…

์ „๋ฌด๋กœ ์Šน์ง„ํ•œ ๋ผ์ด์–ธ์€ ๊ธฐ๋ถ„์ด ๋„ˆ๋ฌด ์ข‹์•„ ํ”„๋ Œ์ฆˆ๋ฅผ ์ด๋Œ๊ณ  ํŠน๋ณ„ ํœด๊ฐ€๋ฅผ ๊ฐ€๊ธฐ๋กœ ํ–ˆ๋‹ค.
๋‚ด์นœ๊น€์— ์—ฌํ–‰ ๊ณ„ํš๊นŒ์ง€ ๊ตฌ์ƒํ•˜๋˜ ๋ผ์ด์–ธ์€ ์žฌ๋ฏธ์žˆ๋Š” ๊ฒŒ์ž„์„ ์ƒ๊ฐํ•ด๋ƒˆ๊ณ  ์—ญ์‹œ ์ „๋ฌด๋กœ ์Šน์ง„ํ• ๋งŒํ•œ ์ธ์žฌ๋ผ๊ณ  ์Šค์Šค๋กœ์—๊ฒŒ ๊ฐํƒ„ํ–ˆ๋‹ค.

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

๊ทธ๋ƒฅ ์ง€๋„๋ฅผ ์ฃผ๊ณ  ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜๋ฉด ์žฌ๋ฏธ๊ฐ€ ๋œํ•ด์ง€๋ฏ€๋กœ, ๋ผ์ด์–ธ์€ ๋ฐฉ๋ฌธํ•  ๊ณณ์˜ 2์ฐจ์› ์ขŒํ‘œ ๊ฐ’์„ ๊ตฌํ•˜๊ณ  ๊ฐ ์žฅ์†Œ๋ฅผ ์ด์ง„ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๊ฐ€ ๋˜๋„๋ก ๊ตฌ์„ฑํ•œ ํ›„, ์ˆœํšŒ ๋ฐฉ๋ฒ•์„ ํžŒํŠธ๋กœ ์ฃผ์–ด ๊ฐ ํŒ€์ด ์Šค์Šค๋กœ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋„๋ก ํ•  ๊ณ„ํš์ด๋‹ค.

๋ผ์ด์–ธ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน๋ณ„ํ•œ ๊ทœ์น™์œผ๋กœ ํŠธ๋ฆฌ ๋…ธ๋“œ๋“ค์„ ๊ตฌ์„ฑํ•œ๋‹ค.

  • ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ x, y ์ขŒํ‘œ ๊ฐ’์€ ์ •์ˆ˜์ด๋‹ค.
  • ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ x๊ฐ’์„ ๊ฐ€์ง„๋‹ค.
  • ๊ฐ™์€ ๋ ˆ๋ฒจ(level)์— ์žˆ๋Š” ๋…ธ๋“œ๋Š” ๊ฐ™์€ y ์ขŒํ‘œ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์ž์‹ ๋…ธ๋“œ์˜ y ๊ฐ’์€ ํ•ญ์ƒ ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์ž‘๋‹ค.
  • ์ž„์˜์˜ ๋…ธ๋“œ V์˜ ์™ผ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ(left subtree)์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ x๊ฐ’์€ V์˜ x๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค.
  • ์ž„์˜์˜ ๋…ธ๋“œ V์˜ ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒ ํŠธ๋ฆฌ(right subtree)์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ x๊ฐ’์€ V์˜ x๊ฐ’๋ณด๋‹ค ํฌ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

๋ผ์ด์–ธ์˜ ๊ทœ์น™์— ๋งž๊ฒŒ ์ด์ง„ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๋งŒ ์ขŒํ‘œ ํ‰๋ฉด์— ๊ทธ๋ฆฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. (์ด์ง„ํŠธ๋ฆฌ์˜ ๊ฐ ๋…ธ๋“œ์—๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด์žˆ๋‹ค.)

tree_3.png

์ด์ œ, ๋…ธ๋“œ๋ฅผ ์ž‡๋Š” ๊ฐ„์„ (edge)์„ ๋ชจ๋‘ ๊ทธ๋ฆฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ชจ์–‘์ด ๋œ๋‹ค.

tree_4.png

์œ„ ์ด์ง„ํŠธ๋ฆฌ์—์„œ ์ „์œ„ ์ˆœํšŒ(preorder), ํ›„์œ„ ์ˆœํšŒ(postorder)๋ฅผ ํ•œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๊ณ , ์ด๊ฒƒ์€ ๊ฐ ํŒ€์ด ๋ฐฉ๋ฌธํ•ด์•ผ ํ•  ์ˆœ์„œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

  • ์ „์œ„ ์ˆœํšŒ : 7, 4, 6, 9, 1, 8, 5, 2, 3
  • ํ›„์œ„ ์ˆœํšŒ : 9, 6, 5, 8, 1, 4, 3, 2, 7

๋‹คํ–‰ํžˆ ๋‘ ํŒ€ ๋ชจ๋‘ ๋จธ๋ฆฌ๋ฅผ ๋ชจ์•„ ๋ถ„์„ํ•œ ๋์— ๋ผ์ด์–ธ์˜ ์˜๋„๋ฅผ ๊ฐ„์‹ ํžˆ ์•Œ์•„์ฐจ๋ ธ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋Š” ๋‚จ์•„์žˆ๋‹ค. ๋…ธ๋“œ์˜ ์ˆ˜๊ฐ€ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ์ ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์˜ˆ์ƒ๋Œ€๋กœ ๋ผ์ด์–ธ์€ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ƒ๊ฐ์ด ์ „ํ˜€ ์—†์—ˆ๋‹ค.

์ด์ œ ๋‹น์‹ ์ด ๋‚˜์„ค ๋•Œ๊ฐ€ ๋˜์—ˆ๋‹ค.

๊ณค๊ฒฝ์— ๋น ์ง„ ์นด์นด์˜ค ํ”„๋ Œ์ฆˆ๋ฅผ ์œ„ํ•ด ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋…ธ๋“œ๋“ค์˜ ์ขŒํ‘œ๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด nodeinfo๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ,
๋…ธ๋“œ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ์ „์œ„ ์ˆœํšŒ, ํ›„์œ„ ์ˆœํšŒํ•œ ๊ฒฐ๊ณผ๋ฅผ 2์ฐจ์› ๋ฐฐ์—ด์— ์ˆœ์„œ๋Œ€๋กœ ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•˜์ž.

์ œํ•œ์‚ฌํ•ญ

  • nodeinfo๋Š” ์ด์ง„ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ ๋…ธ๋“œ์˜ ์ขŒํ‘œ๊ฐ€ 1๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด์žˆ๋Š” 2์ฐจ์› ๋ฐฐ์—ด์ด๋‹ค.
    • nodeinfo์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 10,000 ์ดํ•˜์ด๋‹ค.
    • nodeinfo[i] ๋Š” i + 1๋ฒˆ ๋…ธ๋“œ์˜ ์ขŒํ‘œ์ด๋ฉฐ, [x์ถ• ์ขŒํ‘œ, y์ถ• ์ขŒํ‘œ] ์ˆœ์œผ๋กœ ๋“ค์–ด์žˆ๋‹ค.
    • ๋ชจ๋“  ๋…ธ๋“œ์˜ ์ขŒํ‘œ ๊ฐ’์€ 0 ์ด์ƒ 100,000 ์ดํ•˜์ธ ์ •์ˆ˜์ด๋‹ค.
    • ํŠธ๋ฆฌ์˜ ๊นŠ์ด๊ฐ€ 1,000 ์ดํ•˜์ธ ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.
    • ๋ชจ๋“  ๋…ธ๋“œ์˜ ์ขŒํ‘œ๋Š” ๋ฌธ์ œ์— ์ฃผ์–ด์ง„ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฉฐ, ์ž˜๋ชป๋œ ๋…ธ๋“œ ์œ„์น˜๊ฐ€ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์ฝ”๋“œ

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

struct Node {
    int x; int y; int idx;
    Node* left; Node* right;
    Node(int a, int b, int index) {
        x = a; y = b; idx = index;
        left = nullptr; right = nullptr;
    }
};

bool compare(Node* a, Node* b) {
    if (a->y < b->y) // y ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
        return false;
    else if (a->y == b->y) {
        if (a->x > b->x) { // x ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
            return false;
        }
    }
    return true;
}

void preorder(Node* root, vector<int>& result) {
    result.push_back(root->idx);
    if (root->left != nullptr)
        preorder(root->left, result);
    if (root->right != nullptr)
        preorder(root->right, result);
}

void postorder(Node* root, vector<int>& result) {
    if (root->left != nullptr)
        postorder(root->left, result);
    if (root->right != nullptr)
        postorder(root->right, result);
    result.push_back(root->idx);
}

void makeTree(Node* parent, Node* child) {
    // tree๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฃจํŠธ ๋…ธ๋“œ์— addํ•˜๊ณ ์ž ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐ ์‹œ๋„
    // ๋„ฃ๊ณ ์žํ•˜๋Š” ์œ„์น˜์— ๋…ธ๋“œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋Š” ์žฌ๊ท€๋กœ ๋Œ๋ ค์„œ ํ•ด๋‹น ๋…ธ๋“œ์˜ child๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์„ ์ง€ ์กฐ์‚ฌ
    if (child->x < parent->x) {
        // ์™ผ์ชฝ์— ์œ„์น˜
        if (parent->left == nullptr) parent->left = child;
        else makeTree(parent->left, child);
    }
    else {
        // ์˜ค๋ฅธ์ชฝ์— ์œ„์น˜
        if (parent->right == nullptr) parent->right = child;
        else makeTree(parent->right, child);
    }
}

vector<vector<int>> solution(vector<vector<int>> nodeinfo) {
    vector<vector<int>> answer;

    vector<Node*> nodeVec;

    for (int i = 0; i<nodeinfo.size(); i++) {
        Node* tmp = new Node(nodeinfo[i][0], nodeinfo[i][1], i + 1); // x, y, index ๋„ฃ๊ธฐ
        nodeVec.push_back(tmp); // node ํ•˜๋‚˜์”ฉ ๋„ฃ๊ธฐ
    }
    sort(nodeVec.begin(), nodeVec.end(), compare);
    for (int i = 1; i < nodeVec.size(); i++) {
        makeTree(nodeVec[0], nodeVec[i]);
    }

    vector<int> result;
    preorder(nodeVec[0], result);
    answer.push_back(result);
    result.clear();
    postorder(nodeVec[0], result);
    answer.push_back(result);

    return answer;
}

 

ํ’€์ด

  • ๋ˆ„๊ฐ€๋ด๋„ ํŠธ๋ฆฌ ๋ฌธ์ œ์ด๋‹ค ใ…Žใ…Žใ…Ž
  • ์ž…๋ ฅ๊ฐ’์œผ๋กœ ๋ฏธ๋ฃจ์–ด๋ณผ ๋•Œ ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜๋Š” 10,000๊ฐœ์ด์ง€๋งŒ, ๋งŒ์ผ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด ํŠธ๋ฆฌ์˜ ๊นŠ์ด๊ฐ€ 1,000์ดํ•˜์ด๋ฏ€๋กœ 2^1000๊ฐœ์˜ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.

 

์ฑ„์  ๊ฒฐ๊ณผ

 

์ฃผ์š” ์‚ฌํ•ญ

  • ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฒ•์„ ๊นŒ๋จน์–ด์„œ ํ•œ์ฐธ์„ ํ—ค๋งธ๋‹ค. ์•„๋ฌด๋ฆฌ ์ƒ๊ฐํ•ด๋„ ๋ณต์žกํ•œ ๋ฐฉ๋ฒ•๋ฐ–์— ๋– ์˜ค๋ฅด์ง€ ์•Š์•˜๋‹ค. ์ด๋ฒˆ์— ๋‹ค์‹œ ๋ณธ ๊น€์— ๊ผญ ๊ธฐ์–ตํ•ด๋‘์ž.
  • ํŠธ๋ฆฌ ์ƒ์„ฑ ๋ฐฉ๋ฒ•
    • ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” addNode ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค.
    • addNode ํ•จ์ˆ˜๋Š” parent์™€ child ๋…ธ๋“œ๋ฅผ ๋ฐ›์•„์„œ, parent ์•„๋ž˜์— child ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
    • parent์˜ x์ขŒํ‘œ์™€ child์˜ x์ขŒํ‘œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์‚ฝ์ž… ์œ„์น˜(์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ)๋ฅผ ์ •ํ•œ๋‹ค.
    • ๋งŒ์ผ ์ •ํ•ด์ง„ ์‚ฝ์ž… ์œ„์น˜์— ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ parent๋กœ ํ•˜๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๋Œ๋ฆฐ๋‹ค.
๋ฐ˜์‘ํ˜•