Post

[Silver II] 가장 긴 증가하는 부분 수열 - 11053

[Silver II] 가장 긴 증가하는 부분 수열 - 11053

문제 링크

문제 링크

성능 요약

메모리: 2152 KB, 시간: 0 ms

문제 설명

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

예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.

입력

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.

둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)

출력

첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.

코드

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 이진 탐색 함수: 정렬된 배열에서 num 이상의 첫 번째 위치를 찾음
// lower_bound 함수를 통해서 사용 가능
int binary_search(vector<int>& lis, int num) {
	int low = 0, high = lis.size();

	while (low < high) {
		int mid = low + (high - low) / 2;
		if (lis[mid] < num) {
			low = mid + 1;
		}
		else {
			high = mid;
		}
	}
	return low;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int N;
	cin >> N;

	vector<int> arr(N);  // 입력된 수열
	vector<int> lis;  // LIS를 저장할 벡터
	vector<int> pos(N);  // 각 숫자가 LIS에서 들어간 위치를 기록할 배열
	vector<int> trace(N, -1);  // 이전 위치 추적을 위한 배열

	// 입력 받기
	for (int i = 0; i < N; i++) {
		cin >> arr[i];
	}

	// LIS 구하기
	for (int i = 0; i < N; i++) {
		int num = arr[i];
		int pos_in_lis = binary_search(lis, num);  // 이진 탐색을 통해 LIS에서 들어갈 위치를 찾음


		if (pos_in_lis == lis.size()) {
			lis.push_back(num);  // 새로운 숫자를 LIS의 끝에 추가
		}
		else {
			lis[pos_in_lis] = num;  // 해당 위치의 값을 갱신
		}

		pos[i] = pos_in_lis;  // 해당 숫자가 들어간 위치 기록

		// trace 배열로 이전 요소 추적
		if (pos_in_lis > 0) {
			trace[i] = pos_in_lis - 1;
		}
	}

	// LIS 복원하기
	vector<int> actual_lis(lis.size());
	int current_pos = lis.size() - 1;
	for (int i = N - 1; i >= 0; i--) {
		if (pos[i] == current_pos) {
			actual_lis[current_pos] = arr[i];
			current_pos--;
		}
	}

	cout << lis.size();

	return 0;
}
This post is licensed under CC BY 4.0 by the author.