[코딩테스트 스터디/C++] 백준 18353번 병사 배치하기

최대 1 분 소요

1.문제 링크

https://www.acmicpc.net/problem/18353



2. 풀이 전 계획과 생각

  • 다이나믹 프로그래밍 하기



3. 풀이

#include<iostream>
using namespace std;

int n;
int a[2001];
int d[2001];

int main(){
	// 입력  
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	
	// 가장 긴 감소하는 수열 구하기 
	for(int i=1;i<=n;i++){
        d[i]=1;
        for(int j=1;j<i;j++){
            if(a[j]>a[i] && d[i]<d[j]+1)
                d[i]=d[j]+1;
        }
    }
    
    // 가장 긴 감소하는 수열 구하기  
    int max=d[1];
    for(int i=1;i<=n;i++)
		if(max<d[i]) max=d[i];
	
	// 답 출력  
	cout<<n-max;	
}

가장 긴 증가하는 부분 수열 (Longest Increasing Subsequence)이라는 것이 있다. 백준에도 이문제가 있다.

이 문제를 기반으로 가장 긴 감소하는 부분 수열을 구했다.

이렇게 구한 수열수를 입력 배열 수 n에서 뺀다.



4. 풀이하면서 고민했던 점

  • 가장 긴 증가하는 부분 수열 아이디어를 사용하는 것을 처음에 생각해내지 못함.



5. 문제를 풀고 알게된 개념 및 소감

  • 다이나믹 프로그래밍에 개념에 대해 잘 알게됨