백준 알고리즘
가장 긴 증가하는 부분 수열
rycbar2592
2020. 11. 11. 12:21
가장 길게 증가하는 수열의 길이만 구하면 되는 문제였기 때문에 lower_bound를 이용해서 문제를 해결하였습니다.
가장 긴 증가하는 부분 수열(1, 2, 3) 모두 범위만 다를 뿐 같은 결과를 구하는 문제였기 때문에 아래 코드로 모두 통과하였습니다.
lower_bound의 시간 복잡도가 log이기 때문에 전체 시간 복잡도는 O(NlogN)만에 해결할 수 있었습니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
int N, answer = 987654321, num;
cin >> N;
vector<int> vec;
for (int i = 0; i < N; i++)
{
cin >> num;
vector<int>::iterator iter;
iter = lower_bound(vec.begin(), vec.end(), num);
if (vec.size() == 0) vec.push_back(num);
else if (iter == vec.end()) vec.push_back(num);
else vec[iter - vec.begin()] = num;
}
cout << vec.size() << endl;
return 0;
}
11053번: 가장 긴 증가하는 부분 수열
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이
www.acmicpc.net
12015번: 가장 긴 증가하는 부분 수열 2
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000)
www.acmicpc.net
12738번: 가장 긴 증가하는 부분 수열 3
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000)
www.acmicpc.net