Recent Posts
Notice
No Rules Rules
가장 긴 증가하는 부분 수열 2 (feat. 백준, 12015번) 본문
728x90
반응형
가장 긴 증가하는 부분 수열 2
https://www.acmicpc.net/problem/12015
12015번: 가장 긴 증가하는 부분 수열 2
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000)
www.acmicpc.net
반응형
// woohyeon.kim
// kim519620.tistory.com
#include <iostream>
using namespace std;
int ans[1000001]{ 0 };
int main() {
ios::sync_with_stdio(false), cin.tie(NULL);
register int N, index = 1, start, end, mid, chk;
cin >> N;
for (register int i = 0, v; i < N; ++i) {
cin >> v;
if (ans[index - 1] < v)
ans[index] = v, ++index;
else {
chk = 0;
start = 1;
end = index;
while (end - start >= 0) {
mid = (end + start) / 2;
if (ans[mid] < v)
start = mid + 1;
else
chk = mid, end = mid - 1;
}
if (chk > 0)
ans[chk] = v;
}
}
cout << index - 1;
return 0;
}
// *&)*@*
- 위 문제는 dp를 사용해서 풀수도 있습니다만 카테고리가 이분 탐색이라 이분 탐색 형태로 풀었습니다.
- 입력된 값을 하나씩 받아서 배열을 완성합니다.
- 이때 배열의 마지막값보다 큰값을 받으면 배열에 덧붙이고, 작은 값이라면 만들어진 배열을 이분 탐색하여 입력받은 값과 교체합니다.
- 위 내용은 '길이' 를 구하는 것이기 때문에 가능합니다. 가령 입력이 [10, 15, 20, 13] 이라면 정답은 [10, 15, 20] 이지만 위 이분 탐색을 통하면 [10, 13, 20] 이 정답이 되게 됩니다.
- 하지만 '길이' 는 동일하게 3 이므로 정답을 도출할 수 있습니다.
728x90
반응형
'생활 > 코테' 카테고리의 다른 글
최소직사각형 (feat. 프로그래머스, 86491번) (0) | 2022.08.17 |
---|---|
같은 숫자는 싫어 (feat. 프로그래머스, 12906번) (0) | 2022.08.17 |
K번째 수 (feat. 백준, 1300번) (0) | 2022.08.17 |
공유기 설치 (feat. 백준, 2110번) (0) | 2022.08.17 |
나무 자르기 (feat. 백준, 2805번) (0) | 2022.08.17 |
Comments