알고리즘 공부

백준 2631번 : 줄세우기

EQ1 2020. 4. 12. 20:39

  처음에는 이 문제를 어떻게 풀어야 하나 싶었는데 사실 지금도 어떻게 풀어야 맞는 것인지는 모르겠다. ㅎㅎ;; 왠지모르게! 그냥! 최장길이증가수열(LIS)의 길이를 구한다음에 전체 길이에서 빼주면 그게 답이 되지 않을까? 라고 생각했다. 그냥 어렴풋한 생각으로는 번호 순서대로 서 있다는게 결국에는 증가수열로 서 있다는 것이기 때문에 

 

기존 수열에서 LIS를 구하고 LIS는 그대로 고정!
그리고 나머지를 올바른 위치로 샥샥 옮기면!
증가수열 완성!

 

예를 들어서 3 7 5 2 6 1 4 에서 LIS는 3 5 6이다. 따라서 남은 1 2 4 7을 자리에 맞춰서 샥샥 끼워맞추는 식이다.

 

#include <iostream>

using namespace std;

int n;
int seq[202];
int lis[202];

int main()
{
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        cin >> seq[i];
    }
    
    int maxLen = 1;
    lis[0] = 1;
    for(int i = 1; i < n; i++)
    {
        lis[i] = 1;
        for(int j = 0; j < i; j++)
        {
            if(seq[j] > seq[i]) continue;
            lis[i] = max(lis[i], lis[j] + 1);
        }
        
        maxLen = max(maxLen, lis[i]);
    }
    
    cout << n - maxLen << "\n";
 
    return 0;
}