백준 알고리즘

가장 긴 증가하는 부분 수열

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;
}

 

www.acmicpc.net/problem/11053

 

11053번: 가장 긴 증가하는 부분 수열

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이

www.acmicpc.net

www.acmicpc.net/problem/12015

 

12015번: 가장 긴 증가하는 부분 수열 2

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000)

www.acmicpc.net

www.acmicpc.net/problem/12738

 

12738번: 가장 긴 증가하는 부분 수열 3

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000)

www.acmicpc.net