백준(boj)2631 - 줄세우기

업데이트:

문제 링크 - https://www.acmicpc.net/problem/2631

👀문제이해 및 풀이방법

dp문제 분류에 있길래 도전해 보았는데 정답률은 높고.. 방법은 생각이 안났다. 어떻게 이전의 정보로 다음 정보를 찾을 까 고민하다가 힌트를 봤다
lis문제였다 .. 이걸 알고 5분만에 클리어했다. 아이디어가 정말 중요한데 lis를 찾고 남은 숫자는 어쩔 수 없이 자리를 옮겨야 한다
이런 유형의 문제를 많이 풀어봐야 실전에서 아이디어가 떠오를 것 같다. 알고리즘은 역시 문제를 많이풀어보는게 답인 것 같다

📝코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class lining{
private:
    vector<int> lis;
    int N;
public:
    lining(){
        std::cin >> N;
    }
    void find_sol(){
        int a;
        for(int i=0;i<N;i++){
            std::cin >>a;
            if(lis.empty())
                lis.push_back(a);
            else if(lis.back()<a)
                lis.push_back(a);
            else 
                *lower_bound(lis.begin(),lis.end(),a) = a;
        }
        std::cout << N-lis.size()<<'\n';
    }
};
int main(){
    cin.tie(NULL);cout.tie(NULL);
    ios_base::sync_with_stdio(false);
    lining li;
    li.find_sol();

    return 0;
}

image

댓글남기기