매일매일 코테풀기 (일시 중단!)

(2024-10-31) 2 문제 : 백준 - 2352 (반도체 설계)

오의현 2024. 10. 31. 11:33

 

이전 문제와 동일하게 가장 긴 증가하는 부분수열을 구하는 문제이다. LIS를 구하는 NlogN의 알고리즘을 그대로 적용해주면 된다.

#include <iostream>
#include <vector>

void Init()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
}

int main()
{
    Init();

    int NumPort = 0;
    std::cin >> NumPort;

    std::vector<int> Link(NumPort);
    for (int i = 0; i < NumPort; i++)
    {
        std::cin >> Link[i];
    }
    
    std::vector<int> LIS;
    LIS.reserve(NumPort);

    for (int i = 0; i < Link.size(); i++)
    {
        auto Iter = std::upper_bound(LIS.begin(), LIS.end(), Link[i]);

        if (Iter == LIS.end())
        {
            LIS.push_back(Link[i]);
        }
        else
        {
            *Iter = Link[i];
        }
    }

    std::cout << LIS.size();
    return 0;
}