접근 방법
연결선이 꼬이면 안되기 때문에, 가장 긴 증가하는 부분 순열 (LIS) 알고리즘을 사용하기로 결정
이때 dp로 접근하게 되면 시간 복잡도가 O(n^2)이기에 시간 초과가 발생했다.
여기에서는 시간 복잡도를 O(n log n)으로 줄이기 위해서 이분탐색을 이용하기로 결정한다.
vector<int> v(n) -> 연결되어야 하는 포트 번호들을 입력받는 배열
vector<int> dp -> 증가하는 부분 수열에 들어갈 수를 최적의 값으로 유지하기 위한 배열
int pos -> 반복문을 거치는 현재 원소(v[i])가 dp에 들어갈 위치를 결정하는 역할을 한다.
같은 숫자는 존재하지 않기에 binary_search 함수를 구현, dp에 들어갈 위치를 이분 탐색으로 결정, 반환하는 값(ans)이 dp의 사이즈와 같다면 추가
코드
#include <iostream>
#include <vector>
using namespace std;
int binary_search(vector<int> &dp, int target) {
int lft = 0, rgt = dp.size() - 1;
int ans = rgt + 1;
while (lft <= rgt) {
int mid = (lft + rgt) / 2;
if (dp[mid] > target) {
ans = mid;
rgt = mid - 1;
} else {
lft = mid + 1;
}
}
return ans;
}
int main() {
int n;
cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++) cin >> v[i];
vector<int> dp;
for (int i = 0; i < n; i++) {
int pos = binary_search(dp, v[i]);
if (pos == dp.size()) dp.push_back(v[i]);
else dp[pos] = v[i];
}
cout << dp.size();
return 0;
}
'Koala - 17기 > 코딩테스트 심화 스터디' 카테고리의 다른 글
[백준/Python] 17951번 : 흩날리는 시험지 속에서 내 평점이 느껴진거야 (0) | 2025.02.02 |
---|---|
[백준/자바] 1939. 중량제한 (0) | 2025.02.02 |
[BOJ/Python3] 11658번 : 구간합 구하기 3 (0) | 2025.01.31 |
[백준/Python] 21608번: 상어 초등학교 (0) | 2025.01.26 |
[백준/Python] #30648 트릭플라워 (0) | 2025.01.26 |