백준 12767 - Ceiling Function
문제
백준 12767 - Ceiling Function 풀러가기
문제 풀이
주어진 입력들로 만들 수 있는 서로 다른 binary search tree의 형태 수를 찾는 문제다.
- 주어진 문제로 binary search tree를 만든다.
- 순회 한 결과가 몇개가 있는지 확인하면 된다. 여기선 pre-order로 구현했다.
문제 코드(C++)
-
전체 코드
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394#include <cstdio>#include <set>#include <vector>#include <string>using namespace std;struct Node {int val;Node* left;Node* right;Node() {val = 0;left = NULL;right = NULL;}};string preorder(Node *root) {string ans = "";ans += "V";if (root->left) {ans += "L";ans += preorder(root->left);ans +="l";}if(root->right) {ans += "R";ans += preorder(root->right);ans += "r";}ans += "v";return ans;}void remove(Node *root) {if (root->left) {remove(root->left);}if (root->right) {remove(root->right);}delete root;}int main() {int n, k;scanf("%d %d", &n, &k);set<string> s;while (n--) {vector<int> a(k);for (int i = 0; i < k; i++) {scanf("%d", &a[i]);}Node* root = new Node;root->val = a[0];for (int i = 1; i < k; i++) {Node* curr = root;while (1) {if (curr->val > a[i]) {if (curr->left == NULL) {curr->left = new Node();curr->left->val = a[i];break;}else {curr = curr->left;}}else if (curr->val < a[i]) {if (curr->right == NULL) {curr->right = new Node();curr->right->val = a[i];break;}else {curr = curr->right;}}else{break;}}}s.insert(preorder(root));remove(root);}printf("%d", s.size());return 0;}cs - 54 ~ 88번째 줄 : 주어진 input 배열로 bst를 만든다. 현재 노드보다 값이 작다면 왼쪽에, 오른쪽에 값을 넣는다. 왼쪽이나 오른쪽에 이미 값이 있다면 그 노드로 이동하여, 해당 노드의 자식이 있는지를 파악한다. * 19~34번째 줄 : preorder로 순서를 찾는다. 방문했을 때 V, L, R 방문을 끝내고 나갈 때를 v,l,r로 표시했다.
- 89번째 줄 : preorder 함수에서 구한 값을 set에 넣어준다. set은 중복이 없는 값으로 구성된다.
아직 배움의 과정에 있는 학생이니 내용에 부족한 점이 보이면 지적은 하되, 비난은 하지 말아주세요!!
댓글남기기