본문 바로가기

백준

백준11568 - 민균이의 계락

 

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

 

11568번: 민균이의 계략

민균이는 요즘 준민이를 놀리는 일에 재미가 들렸다. 오늘도 그는 준민이를 놀리기 위해 한가지 재미있는 아이디어를 떠올렸다. 그는 하나의 정수가 쓰여 있는 카드 N장을 준비하여 준민이에게 정해진 순서대로 보여줄 것이다. 준민이는 앞의 카드부터 임의의 개수만큼 골라서 민균이에게 제시하게 되는데, 제시한 카드의 수열이 순증가가 아니면 민균이에게 바보라고 놀림받게 된다. 예를 들어 민균이가 보여준 카드가 {4, 9, 10, 9} 일 때 준민이가 {4, 9}를 골

www.acmicpc.net

항상 두려워하던 LIS문제를 풀었다. 시간복잡도 O(n) = NlogN을 활용하였다. 주목할 점은 현재 숫자가 이전 수열 결과의 가장 큰 수 보다 클 경우 숫자를 넣어주고 그렇지 않은 경우는 현재 숫자보다 작으면서 제일 큰 숫자를 찾아 현재 숫자와 교체 해주는 것이다.

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	int n;
	int num;
	vector<int> v;

	cin >> n;
	v.push_back(0); //주어진 숫자보다 작은 숫자를 미리 넣는다.
	for (int i = 0; i < n; i++) {
		cin >> num;
		if (v.back() < num) { //현재 숫자가 구한 수열의 가장 큰 수보다 큰 경우
			v.emplace_back(num);
		}
		else { //현재 숫자가 구한 수열의 가장 큰 수보다 작은 경우
			auto it = lower_bound(v.begin(), v.end(), num); //lower_bound로 이분탐색
			*it = num; //현재 숫자를 찾은 곳에 삽입
		}
	}

	cout << v.size() - 1;

}

'백준' 카테고리의 다른 글

백준10844 - 쉬운 계단 수  (0) 2020.01.30
백준2565 - 전깃줄  (0) 2020.01.28
백준2210 - 숫자판 점프  (0) 2020.01.19
백준2096 - 내려가기  (0) 2020.01.18
백준1654 - 랜선 자르기  (0) 2020.01.16