๊ธธ ์ฐพ๊ธฐ ๊ฒ์
โ โ โ โโ LEVEL 3
๋ฌธ์
๊ธธ ์ฐพ๊ธฐ ๊ฒ์ ๋ฌธ์ ๋งํฌ
๋ฌธ์ ์ค๋ช
์ ๋ฌด๋ก ์น์งํ ๋ผ์ด์ธ์ ๊ธฐ๋ถ์ด ๋๋ฌด ์ข์ ํ๋ ์ฆ๋ฅผ ์ด๋๊ณ ํน๋ณ ํด๊ฐ๋ฅผ ๊ฐ๊ธฐ๋ก ํ๋ค.
๋ด์น๊น์ ์ฌํ ๊ณํ๊น์ง ๊ตฌ์ํ๋ ๋ผ์ด์ธ์ ์ฌ๋ฏธ์๋ ๊ฒ์์ ์๊ฐํด๋๊ณ ์ญ์ ์ ๋ฌด๋ก ์น์งํ ๋งํ ์ธ์ฌ๋ผ๊ณ ์ค์ค๋ก์๊ฒ ๊ฐํํ๋ค.
๋ผ์ด์ธ์ด ๊ตฌ์ํ(๊ทธ๋ฆฌ๊ณ ์๋ง๋ ๋ผ์ด์ธ๋ง ์ฆ๊ฑฐ์ธ๋งํ) ๊ฒ์์, ์นด์นด์ค ํ๋ ์ฆ๋ฅผ ๋ ํ์ผ๋ก ๋๋๊ณ , ๊ฐ ํ์ด ๊ฐ์ ๊ณณ์ ๋ค๋ฅธ ์์๋ก ๋ฐฉ๋ฌธํ๋๋ก ํด์ ๋จผ์ ์ํ๋ฅผ ๋ง์น ํ์ด ์น๋ฆฌํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฅ ์ง๋๋ฅผ ์ฃผ๊ณ ๊ฒ์์ ์์ํ๋ฉด ์ฌ๋ฏธ๊ฐ ๋ํด์ง๋ฏ๋ก, ๋ผ์ด์ธ์ ๋ฐฉ๋ฌธํ ๊ณณ์ 2์ฐจ์ ์ขํ ๊ฐ์ ๊ตฌํ๊ณ ๊ฐ ์ฅ์๋ฅผ ์ด์งํธ๋ฆฌ์ ๋ ธ๋๊ฐ ๋๋๋ก ๊ตฌ์ฑํ ํ, ์ํ ๋ฐฉ๋ฒ์ ํํธ๋ก ์ฃผ์ด ๊ฐ ํ์ด ์ค์ค๋ก ๊ฒฝ๋ก๋ฅผ ์ฐพ๋๋ก ํ ๊ณํ์ด๋ค.
๋ผ์ด์ธ์ ์๋์ ๊ฐ์ ํน๋ณํ ๊ท์น์ผ๋ก ํธ๋ฆฌ ๋ ธ๋๋ค์ ๊ตฌ์ฑํ๋ค.
- ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๋ชจ๋ ๋ ธ๋์ x, y ์ขํ ๊ฐ์ ์ ์์ด๋ค.
- ๋ชจ๋ ๋ ธ๋๋ ์๋ก ๋ค๋ฅธ x๊ฐ์ ๊ฐ์ง๋ค.
- ๊ฐ์ ๋ ๋ฒจ(level)์ ์๋ ๋ ธ๋๋ ๊ฐ์ y ์ขํ๋ฅผ ๊ฐ์ง๋ค.
- ์์ ๋ ธ๋์ y ๊ฐ์ ํญ์ ๋ถ๋ชจ ๋ ธ๋๋ณด๋ค ์๋ค.
- ์์์ ๋ ธ๋ V์ ์ผ์ชฝ ์๋ธ ํธ๋ฆฌ(left subtree)์ ์๋ ๋ชจ๋ ๋ ธ๋์ x๊ฐ์ V์ x๊ฐ๋ณด๋ค ์๋ค.
- ์์์ ๋ ธ๋ V์ ์ค๋ฅธ์ชฝ ์๋ธ ํธ๋ฆฌ(right subtree)์ ์๋ ๋ชจ๋ ๋ ธ๋์ x๊ฐ์ V์ x๊ฐ๋ณด๋ค ํฌ๋ค.
์๋ ์์๋ฅผ ํ์ธํด๋ณด์.
๋ผ์ด์ธ์ ๊ท์น์ ๋ง๊ฒ ์ด์งํธ๋ฆฌ์ ๋ ธ๋๋ง ์ขํ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. (์ด์งํธ๋ฆฌ์ ๊ฐ ๋ ธ๋์๋ 1๋ถํฐ N๊น์ง ์์๋๋ก ๋ฒํธ๊ฐ ๋ถ์ด์๋ค.)
์ด์ , ๋ ธ๋๋ฅผ ์๋ ๊ฐ์ (edge)์ ๋ชจ๋ ๊ทธ๋ฆฌ๋ฉด ์๋์ ๊ฐ์ ๋ชจ์์ด ๋๋ค.
์ ์ด์งํธ๋ฆฌ์์ ์ ์ ์ํ(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
์ดํ์ธ ๊ฒฝ์ฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค. - ๋ชจ๋ ๋ ธ๋์ ์ขํ๋ ๋ฌธ์ ์ ์ฃผ์ด์ง ๊ท์น์ ๋ฐ๋ฅด๋ฉฐ, ์๋ชป๋ ๋ ธ๋ ์์น๊ฐ ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๋ ์๋ค.
- nodeinfo์ ๊ธธ์ด๋
์ฝ๋
#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๋ก ํ๋ ์ฌ๊ทํจ์๋ฅผ ๋๋ฆฐ๋ค.
Comment