쾌락없는 책임 (공부)/알고리즘 문제풀이
백준 12738 가장 긴 증가하는 부분수열 3 - C++, LIS
허스크
2021. 8. 23. 21:32
반응형
12015번: 가장 긴 증가하는 부분 수열 2
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000)
www.acmicpc.net
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n, input;
int main(){
scanf("%d", &n);
vector<int> num;
for(int i = 0; i < n; i++){
scanf("%d", &input);
if(num.empty() || num.back() < input)
num.push_back(input);
else {
auto temp = lower_bound(num.begin(), num.end(), input);
*temp = input;
}
}
printf("%d\n", num.size());
}
이전에 시리즈 1탄을 풀이하고 나서 오랜만에 풀어보는 LIS 알고리즘입니다. 위 문제의 경우 테스트 케이스 양이 많기 때문에 2중 포문을 통한 O(N^2) 알고리즘으로는 안되고 O(Nlogn) 알고리즘을 사용해야 합니다.
자세한 내용은 따로 정리를 할거라 생략하고 위 알고리즘은 하나씩 입력값을 받으며 정답 백터인 num에 넣어주는 것으로 새 입력값이 기존 벡터의 제일 큰 값보다 크면 뒤에 넣고 만약 아니라면 벡터의 원소들 중 어느 위치에 들어갈 수 있는지 확인하고 이를 교체하는 방식입니다.
반응형