가장 긴 증가하는 부분 수열 2 성공
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 | 512 MB | 31984 | 12996 | 9099 | 41.958% |
문제
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000)
출력
첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
예제 입력 1 복사
6
10 20 10 30 20 50
예제 출력 1 복사
4
<코드>
#include<iostream>
#include<vector>
using namespace std;
int N;
vector<int> arr, res;
int lower_bound(vector<int>& arr, int key){
int start = 0;
int end = arr.size()-1;
int mid;
while(end>start){
int mid = (start+end)/2;
if(key>arr[mid])
start=mid+1;
else
end=mid;
}
return end;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>N;
arr.resize(N);
for(int i = 0; i<N; i++){
cin >>arr[i];
}
int cnt=1;
res.push_back(arr[0]);
for(int i = 1; i<N; i++){
if(res.back()<arr[i]){
res.push_back(arr[i]);
cnt++;
}
else{
int idx = lower_bound(res, arr[i]);
res[idx] = arr[i];
}
}
cout<<cnt;
return 0;
}
<설명>
arr 배열에서 원소들을 차례대로 하나씩 보면서, res배열에 증가하는 순으로 삽입한다. res 배열의 가장 마지막 원소보다 arr배열의 원소가 클 경우 res배열의 가장 마지막에 삽입하고, 그렇지 않은경우(arr배열의 원소가 res배열의 가장 마지막 원소보다 같거나 작으면) lower_bound 함수를 통해서 res배열에서 arr원소 크기 이상의 원소가 처음 나오는 인덱스를 찾은 후 그 res배열의 인덱스에 arr원소로 바꿔치기한다. 이 lower_bound 함수를 통해 이분탐색으로 해결하는 문제였다.
'백준 알고리즘 풀이' 카테고리의 다른 글
백준 1956(운동) C++ (0) | 2022.11.10 |
---|---|
백준 1766(문제집) C++ (0) | 2022.11.07 |
백준 2738(행렬 덧셈) C언어 (0) | 2022.10.31 |
백준 11404(플로이드) C++ (0) | 2022.10.29 |
백준 10718(We love kriii) C언어 (0) | 2022.07.31 |