코딩테스트/백준_골드 [C++][백준 2631] 줄세우기 - [문제] https://www.acmicpc.net/problem/2631 2631번: 줄세우기 KOI 어린이집에는 N명의 아이들이 있다. 오늘은 소풍을 가는 날이다. 선생님은 1번부터 N번까지 번호가 적혀있는 번호표를 아이들의 가슴에 붙여주었다. 선생님은 아이들을 효과적으로 보호하기 www.acmicpc.net [문제 풀이] 어려워보이지만 생각보다 간단하게 맞출 수 있는 문제다. 문제에 낚이지 말고 해당 결과값을 만들기 위해서 뭐가 필요한지를 잘 생각하자! 만일 살짝 고민해봐도 모르겠다면 가장 긴 증가하는 부분 수열 해당 문제를 한번 보고 오자. 만일 보고 왔다면 아마도 감이 왔을것이다. 그래도 모르겠다면 이런식으로 생각해보자. 증가하는 부분 수열이라는 말은 반대로 말하면 해당 부분들을 제외하고 움직이면 오름차순대로 줄을 세울 수 있다. 즉 N - 가장 긴증가하는 부분 수열의 길이를 빼면 해당 문제의 답이 나올 수 있다. i를 1부터 순서대로 가게 만들고 j를 i 이하까지 계속 돌리자.(14~16) 만일 i번째 수보다 j가 작다면(17) 또한 해당 자리수의 증가하는 부분 수열의 길이가 더 크다면 해당 부분 수열의 길이보다 증가시켜주자.(18) [코드] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 #include<iostream> #include<algorithm> #define endl "\n" using namespace std; int cares[201]; int DP[201]; void solve(int n){ int Max = 0; DP[0] =1; for(int i = 1;i<n;i++){ DP[i] = 1; for(int j = 0;j<i;j++){ if(cares[i]>cares[j]){ if(DP[j] >= DP[i]){ DP[i] = DP[j] +1; } else{ continue; } } } if(Max<DP[i]){ Max = DP[i]; } } cout<<n- Max<<endl; return; } int main(){ int n; cin>>n; for(int i = 0;i<n;i++){ cin>>cares[i]; } solve(n); return 0; } Colored by Color Scripter cs 공유하기 URL 복사카카오톡 공유페이스북 공유엑스 공유 게시글 관리 구독하기Yoon-1212 Contents 당신이 좋아할만한 콘텐츠 [C++][백준 14002] 가장 긴 증가하는 부분 수열 4 2022.09.10 [C++][백준 12738] 가장 긴 증가하는 부분 수열 3 2022.09.08 [C++][백준 12015] 가장 긴 증가하는 부분 수열 2 2022.09.07 [C++][백준 9663] N-Queen 2022.09.03 댓글 0 + 이전 댓글 더보기