Skip to content

Commit

Permalink
[Gold II] Title: 가장 긴 증가하는 부분 수열 2, Time: 160 ms, Memory: 12200 KB -B…
Browse files Browse the repository at this point in the history
…aekjoonHub
  • Loading branch information
belowyoon committed Apr 26, 2024
1 parent 48b329c commit b11fe10
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# [Gold II] 가장 긴 증가하는 부분 수열 2 - 12015

[문제 링크](https://www.acmicpc.net/problem/12015)

### 성능 요약

메모리: 12200 KB, 시간: 160 ms

### 분류

이분 탐색, 가장 긴 증가하는 부분 수열: O(n log n)

### 제출 일자

2024년 4월 26일 22:45:23

### 문제 설명

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

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

### 입력

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

<p>둘째 줄에는 수열 A를 이루고 있는 A<sub>i</sub>가 주어진다. (1 ≤ A<sub>i</sub> ≤ 1,000,000)</p>

### 출력

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

Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

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

int n;
cin >> n;

vector<int> arr(n, 0);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}

vector<int> sorted;
sorted.push_back(arr[0]);
for (int i = 1; i < n; i++) {
if (sorted[sorted.size()-1] < arr[i]) {
sorted.push_back(arr[i]);
} else {
int s = 0, e = sorted.size()-1, mid;
while (s < e) {
mid = (s + e) / 2;
if (arr[i] > sorted[mid]) {
s = mid + 1;
} else {
e = mid;
}
}
sorted[s] = arr[i];
}
}
cout << sorted.size();
return 0;
}

0 comments on commit b11fe10

Please sign in to comment.