문제
이진 탐색 트리는 모든 노드가 많아야 2개의 자식 노드를 가지고 있는 트리이고, 각 노드에는 수가 하나씩 쓰여있다. 만약 어떤 노드에 쓰여 있는 수가 X라면, 그 노드의 왼쪽 서브트리에는 X보다 작은 수, 오른쪽 서브트리에는 X보다 큰 수만 저장되어 있어야 한다.
1보다 크거나 같고, N보다 작거나 같은 수 N개가 한 번씩 등장하는 수열이 입력으로 주어진다. 이 수열을 이용해서 이진 탐색 트리를 만들려고 한다. 이제 배열의 첫 번째 수를 루트 노드로 놓고, 다른 나머지 수들을 순서대로 삽입하면서 이진 탐색 트리를 만들려고 한다. 즉, 첫 번째 수를 제외한 모든 수에 대해서 insert(X,root)를 실행하는 것과 같다. 그 함수는 다음과 같다.
이진 탐색 트리에 삽입하는 함수는 다음과 같다.
insert(number X, node N) 카운터 C값을 1 증가시킨다 if X가 노드 N에 있는 수보다 작다면 if N의 왼쪽 자식이 없다면 X를 포함하는 새 노드를 만든 뒤, N의 왼쪽 자식으로 만든다 else insert(X, N의 왼쪽 자식) else (X가 노드 N에 있는 수보다 크다면) if N의 오른쪽 자식이 없다면 X를 포함하는 새 노드를 만든 뒤, N의 오른쪽 자식으로 만들기 else insert(X, N의 오른쪽 자식)
각 수를 삽입한 후에 C의 값을 출력하는 프로그램을 작성하시오. 카운터 C의 값은 0으로 초기화되어 있다.
입력
첫째 줄에 수열의 크기 N이 주어진다. (1 ≤ N ≤ 300,000)
다음 N개의 줄에는 수열의 수가 차례대로 주어진다. 수는 구간 [1, N]에 포함된 정수이고, 중복되지 않는다.
출력
N개의 줄에 각 수가 트리에 삽입된 후에 카운터 C값을 한 줄에 하나씩 출력한다.
문제 풀이
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
//int map[300000];
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
//이진탐색트리는 모든 노드가 많아야 2개의 자식 노드를 가지고 있는 트리
//수열의 크기 N이 주어진다
//N개의 줄에는 수열의 수가 차례대로 주어진다
//N개의 줄에 각 수가 트리에 삽입된 후에 카운터 C 값을 한줄에 하나씩 출력한다.
int n = 0;
cin >> n;
long long C = 0;
map <int, int> depth;
for (int i = 0; i < n; i++) {
int num;
cin >> num;
if (i == 0) {
depth[num] = 1;//root
cout << C << endl;
continue;
}
auto iterator = depth.upper_bound(num);
//upper_bound 함수의 경우 컨테이너의 오른쪽 원소 중 기준 원소보다 큰 값 중 가장 왼쪽에 있는 원소를 리턴
int height = 0;
//제일 큰 숫자가 아닌 경우
if (iterator != depth.end()) {
height = iterator->second;
}
if (iterator != depth.begin()) {
iterator--;
height = max(height, iterator->second);
}
C += height;
cout << C << endl;
depth[num] = height + 1;
}
return 0;
}
DP의 BST 개념을 이용하기 전에,
STL map 공부가 필요하다.
https://jaimemin.tistory.com/1292 참고했습니다 어려워요..........
'programming language > Algorithm' 카테고리의 다른 글
[Dynamic Programming 예제] 백준 2098 외판원문제 (0) | 2021.08.15 |
---|---|
STL::map (0) | 2021.08.15 |
[Dynamic Programming 예제] 백준 11404 플로이드 (0) | 2021.08.14 |
Dynamic Programming (0) | 2021.08.12 |
[Divide and Conquer 예제] 백준 2751 수 정렬하기2 (0) | 2021.08.10 |