본문 바로가기

백준 알고리즘 풀이

백준 12015(가장 긴 증가하는 부분 수열2) C++

가장 긴 증가하는 부분 수열 2 성공

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 512 MB 31984 12996 9099 41.958%

문제

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.

예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {1020, 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