Hello Ocean! ๐ŸŒผ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/C++] ๊ธธ ์ฐพ๊ธฐ ๊ฒŒ์ž„ ๋ณธ๋ฌธ

Algorithm

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/C++] ๊ธธ ์ฐพ๊ธฐ ๊ฒŒ์ž„

bba_dda 2021. 1. 25. 17:23
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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

๊ทธ๋ƒฅ ์ง€๋„๋ฅผ ์ฃผ๊ณ  ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•˜๋ฉด ์žฌ๋ฏธ๊ฐ€ ๋œํ•ด์ง€๋ฏ€๋กœ, ๋ผ์ด์–ธ์€ ๋ฐฉ๋ฌธํ•  ๊ณณ์˜ 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 result
[[5,3],[11,5],[13,3],[3,5],[6,1],[1,3],[8,6],[7,2],[2,2]] [[7,4,6,9,1,8,5,2,3],[9,6,5,8,1,4,3,2,7]]

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

๋ฌธ์ œ์— ์ฃผ์–ด์ง„ ์˜ˆ์‹œ์™€ ๊ฐ™๋‹ค.

 

๋ฌธ์ œ๋ฅผ ์š”์•ฝํ•ด๋ณด๋ฉด, 

"์ด์ง„ ํƒ์ƒ‰ํŠธ๋ฆฌ"๋ฅผ ๋งŒ๋“ค์–ด์„œ, "์ „์œ„ ์ˆœํšŒ"์™€ "ํ›„์œ„ ์ˆœํšŒ"ํ•œ ๊ฒฐ๊ณผ๋ฅผ returnํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฐจ์ด์ ์ด ์žˆ๋‹ค๋ฉด ํŠธ๋ฆฌ ๋…ธ๋“œ์˜ ํ˜•ํƒœ์ด๋‹ค.

  ๋ณดํ†ต์˜ ํŠธ๋ฆฌ ๋…ธ๋“œ ์ด ๋ฌธ์ œ์—์„œ์˜ ํŠธ๋ฆฌ ๋…ธ๋“œ
๊ตฌ์„ฑ ์š”์†Œ key
left ํฌ์ธํ„ฐ
right ํฌ์ธํ„ฐ
x
y
number(์ž…๋ ฅ๋œ ์ˆœ์„œ)
left ํฌ์ธํ„ฐ
right ํฌ์ธํ„ฐ
์‚ฝ์ž… ๊ธฐ์ค€ key x
์ˆœํšŒํ•  ๋•Œ ํ‘œ์‹œ๋˜๋Š” ์ˆซ์ž key number

๋ณดํ†ต์˜ ๊ฒฝ์šฐ์—๋Š” key๊ฐ€ ํŠธ๋ฆฌ์— ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ ๊ธฐ์ค€์ด ๋˜๋Š” ์—ญํ• ๊ณผ, ์ˆœํšŒ ์‹œ์— ๊ทธ ๋…ธ๋“œ๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ์ˆซ์ž๋กœ ์ด์šฉ๋œ๋‹ค. 

ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ์—์„œ๋Š” ์‚ฝ์ž… ๊ธฐ์ค€์€ x๊ฐ’์ด ์ด์šฉ๋˜๊ณ , ์ˆœํšŒ ์‹œ์— ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ์ˆซ์ž๋กœ๋Š” ์ž…๋ ฅ๋œ ์ˆœ์„œ(number)๊ฐ€ ์ด์šฉ๋œ๋‹ค. 

ํ’€์ด

์ฒ˜์Œ์—๋Š” nodeinfo์— ๋“ค์–ด์žˆ๋Š” ์ˆœ์„œ๋Œ€๋กœ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๋ฌด์กฐ๊ฑด ์ฒซ ๋ฒˆ์งธ๋กœ ์ž…๋ ฅ๋œ ๋…ธ๋“œ๊ฐ€ root๊ฐ€ ๋˜์–ด ๋ฌธ์ œ์—์„œ ์ œ์‹œ๋œ ๋ชจ์–‘๋Œ€๋กœ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์—ˆ๋‹ค. 

๋ฌธ์ œ์— ์ฃผ์–ด์ง„ ์ด ๊ทธ๋ฆผ์„ ๋ณด๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ์˜ y๊ฐ’์ด ํด ์ˆ˜๋ก root์ชฝ์œผ๋กœ ์œ„์น˜ํ•ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋จผ์ € ์‚ฝ์ž…๋ ์ˆ˜๋ก root์™€ ๊ฐ€๊น๊ฒŒ ์œ„์น˜ํ•˜๋ฏ€๋กœ, nodeinfo์— ๋“ค์–ด์žˆ๋Š” ๋…ธ๋“œ๋“ค์„ y๊ฐ’ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ํŠธ๋ฆฌ์— ์‚ฝ์ž…ํ–ˆ๋‹ค. 

์ฝ”๋“œ

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

using namespace std;

//x์ขŒํ‘œ : key ์—ญํ•  
typedef struct Node{
public:
	int x;
	int y;
	int number;
	Node *left, *right;
}Node;

bool cmp(vector<int> a, vector<int> b) {
	return a[1] > b[1];
}
void insert_node(Node **root, int x, int y, int number) {
	Node *parent, *t;
	Node *new_;
	t = *root;
	parent = NULL;
	while (t != NULL) {
		if (x == t->x)
			return;
		parent = t;
		if (x < t->x)
			t = t->left;
		else
			t = t->right;
	}
	new_ = (Node*)malloc(sizeof(Node));
	if (new_ == NULL)
		return;
	new_->x = x;
	new_->y = y;
	new_->number = number;
	new_->left = NULL;
	new_->right = NULL;
	if (parent != NULL)
		if (x < parent->x)
			parent->left = new_;
		else
			parent->right = new_;
	else
		*root = new_;
}
vector<int> pre_result;
void Preorder(Node *root) {
    pre_result.push_back(root->number);
    if (root->left)
        Preorder(root->left);
    if (root->right)
        Preorder(root->right);
}

vector<int> post_result;
void Postorder(Node *root) {
    if (root->left)
        Postorder(root->left);
    if (root->right)
        Postorder(root->right);
    post_result.push_back(root->number);
}

vector<vector<int>> solution(vector<vector<int>> nodeinfo) {
	vector<vector<int>> answer;
	int number = 0;
	int x, y;
	Node *root = NULL;
	for (int i = 0;i < nodeinfo.size();i++) {
		nodeinfo[i].push_back(i + 1);
	}
	sort(nodeinfo.begin(), nodeinfo.end(), &cmp);
	for (int i = 0;i < nodeinfo.size();i++) {
		x = nodeinfo[i][0];
		y = nodeinfo[i][1];
		number = nodeinfo[i][2];
		insert_node(&root, x, y, number);
	}
	Preorder(root);
	answer.push_back(pre_result);
	Postorder(root);
	answer.push_back(post_result);
	return answer;
}

๊ฒฐ๊ณผ

์ฐธ๊ณ 

ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด์„œ, c++์—์„œ struct์™€ class์˜ ์ฐจ์ด์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด์•˜๋‹ค. 

bba-dda.tistory.com/entry/C-struct%EC%99%80-class%EC%9D%98-%EC%B0%A8%EC%9D%B4

๋ฐ˜์‘ํ˜•