https://www.acmicpc.net/problem/1365
๋ฌธ์
๊ณตํ๊ตญ์ ์๋ ์ ์คํ์ด ์์์๋ ๊ธธ์ ์ฌ์ด์ ๋๊ณ ์ ๋ด๋๊ฐ ์๋์ ๊ฐ์ด ๋ ์ค๋ก ๋์ด์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธธ ์ผํธ๊ณผ ๊ธธ ์ค๋ฅธํธ์ ์ ๋ด๋๋ ํ๋์ ์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค. ์ด๋ค ์ ๋ด๋๋ ๋ ๊ฐ ์ด์์ ๋ค๋ฅธ ์ ๋ด๋์ ์ฐ๊ฒฐ๋์ด ์์ง๋ ์๋ค.
๋ฌธ์ ๋ ์ด ๋ ์ ๋ด๋ ์ฌ์ด์ ์๋ ์ ๊น์ค์ด ๋งค์ฐ ๊ผฌ์ฌ ์๋ค๋ ์ ์ด๋ค. ๊ผฌ์ฌ์๋ ์ ๊น์ค์ ํ์ฌ๋ฅผ ์ ๋ฐํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ์ ์คํ์ด ์์ ์์ฅ ์ํ์๋ ์ ๊ฒฉ์ ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ก ํ๋ค.
์ํ์๋ ๊ผฌ์ฌ ์๋ ์ ๊น์ค ์ค ๋ช ๊ฐ๋ฅผ ์ ์ ํ ์๋ผ ๋ด์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ก ํ๋ค. ํ์ง๋ง ์ด๋ฏธ ์ค์นํด ๋์ ์ ์ ์ด ์๊น๊ธฐ ๋๋ฌธ์ ์๋ผ๋ด๋ ์ ์ ์ ์ต์๋ก ํ์ฌ ๊ผฌ์ฌ ์๋ ์ ์ ์ด ํ๋๋ ์๊ฒ ๋ง๋ค๋ ค๊ณ ํ๋ค.
์ ์คํ์ด ์์ ์์ฅ ์ํ์๋ฅผ ๋์ ์๋ผ๋ด์ผ ํ ์ ์ ์ ์ต์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ ์ค์ ์ ๋ด๋์ ๊ฐ์ N(1 ≤ N ≤ 100,000)์ด ์ฃผ์ด์ง๊ณ , ์ด์ด์ N๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์๊ฐ N๊ฐ ์ฃผ์ด์ง๋ค. i๋ฒ์งธ ์ค์ ์ ๋ ฅ๋๋ ์์ฐ์๋ ๊ธธ ์ผ์ชฝ์ i๋ฒ์งธ ์ ๋ด๋์ ์ฐ๊ฒฐ๋ ๊ธธ ์ค๋ฅธํธ์ ์ ๋ด๋๊ฐ ๋ช ๋ฒ ์ ๋ด๋์ธ์ง๋ฅผ ๋ํ๋ธ๋ค.
์ถ๋ ฅ
์ ์ ์ด ๊ผฌ์ด์ง ์์ผ๋ ค๋ฉด ์ต์ ๋ช ๊ฐ์ ์ ์ ์ ์๋ผ๋ด์ผ ํ๋ ์ง๋ฅผ ์ฒซ์งธ ์ค์ ์ถ๋ ฅํ๋ค.
ํ์ด
๊ทธ๋ฆผ์ผ๋ก ์๊ฐํ๋ฉด ์กฐ๊ธ ์ด๋ ต์ง๋ง ํ์ด๋ฒ๋ง ์๊ฐํด๋ด๋ฉด ์์ธ๋ก ๊ฐ๋จํ๋ค
์ด ๋ฌธ์ ์ ๋ชฉํ๋ฅผ ๋ณด์
: ์ต์ํ์ ์ ์ ์ ์๋ผ๋ด์ "๊ผฌ์ด์ง ์์ ์ํ์ ์ ์ ๋ค"๋ง ๋จ๊ฒจ๋ฌ์ผํ๋ค.
์ ์ ์ด ๊ผฌ์ด์ง ์์ผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
๋ฐ๋๋ก ์๊ฐํด๋ณด์, ์ ์ ์ด ๊ผฌ์ด๋ ๊ฒฝ์ฐ๋ ์ด๋ค ๊ฒฝ์ฐ์ผ๊น?
ํ ์ ๋ด๋๊ฐ '์์ ์ ์์ ์๋ ์ ๋ด๋๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ด๋'์ ์์ชฝ ์ ๋ด๋์ ์ฐ๊ฒฐ๋๋ฉด ๊ทธ ์๊ฐ ์ ์ ์ ๊ผฌ์ด๊ฒ ๋๋ค.
์ผ์ชฝ ๊ธธ์ ์๋ ์ ๋ด๋๋ฅผ ๊ธฐ์ค์ผ๋ก, n๋ฒ์งธ ์ ๋ด๋๋ n-1๋ฒ์งธ ์ ๋ด๋๊ฐ ์ฐ๊ฒฐ๋ ์ค๋ฅธ์ชฝ ์ ๋ด๋๋ณด๋ค ๋ค์ชฝ์ ์ฐ๊ฒฐ๋์ด์ผํ๋ค.
์ค๋ช ์ด ๊ธธ์์ผ๋ ๊ฒฐ๋ก ์ ๊ฐ๋จํ๋ค.
๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ตฌํ๋ฉด ๋๋ค. (= ์ต์ฅ ๋ถ๋ถ ์ฆ๊ฐ ์์ด, = Longest Increasing Subsequent)
๊ทธ๋ฆฌ๊ณ ํด๋น ์์ด์ ๋ค์ด๊ฐ์ง ์๋ ์ ์ ๋ค์ ๋ค ๋์ด๋ฒ๋ฆฌ์
์ต์ฅ ๋ถ๋ถ ์ฆ๊ฐ ์์ด์ ๊ตฌํ๋ ๊ณผ์ ์์๋ dp๋ฅผ ์ฌ์ฉํ๋ค
๋ณดํต dp[i] : v[i]๋ก ๋๋๋ ์ต์ฅ์ฆ๊ฐ๋ถ๋ถ์์ด <- ์ด๋ ๊ฒ ํ๋๋ฐ, ์ด ๊ฒฝ์ฐ ์ด์ค for๋ฌธ์ผ๋ก ์ธํด ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค
์ด๋ถํ์์ ์ด์ฉํด์ dp[i] : ๊ธธ์ด i์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด ์ค ๊ฐ๋ฅํ ๊ฐ์ฅ ์์ ๋ง์ง๋ง ๊ฐ ์ผ๋ก ๊ตฌํด๋ณด์
์ฝ๋
// ํ์ด : https://whkakrkr.tistory.com
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int getLowerBound(int target, vector<int>&v) {
int left=0, right=v.size();
while(left<right) {
int mid = (right-left)/2 + left;
if(v[mid] < target) {
left = mid+1;
} else {
right = mid;
}
}
return left;
}
int main() {
// ์
๋ ฅ
int n;
cin >> n;
vector<int>v(n);
for(int i=0; i<n; i++) {
cin >> v[i];
}
// ํ์ด
vector<int>dp;
dp.push_back(v[0]);
for(int i=1; i<n; i++) {
if(dp.back() < v[i]) {
dp.push_back(v[i]);
} else {
int idx = getLowerBound(v[i], dp);
dp[idx] = v[i];
}
}
int lis = dp.size();
// ์ถ๋ ฅ
cout << n - lis;
return 0;
}
์ํ์ฐฉ์ค
dp๋ฅผ ์ด์ฉํ์ฌ ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด์ ๊ตฌํ์ผ๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ด๋ค.
// ํ์ด : https://whkakrkr.tistory.com
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// ์
๋ ฅ
int n;
cin >> n;
vector<int>v(n);
for(int i=0; i<n; i++) {
cin >> v[i];
}
// ํ์ด
vector<int>dp(n,0); // dp[i] : v[i]๋ก ๋๋๋ ์ต์ฅ์ฆ๊ฐ๋ถ๋ถ์์ด
dp[0] = 1;
for(int i=1; i<n; i++) {
int tmpMax = 0;
for(int j=0; j<i; j++) {
if(v[j]<v[i] && tmpMax<dp[j]) {
tmpMax = dp[j];
}
}
dp[i] = 1+tmpMax;
}
// longest increasing subsequent
int lis = *max_element(dp.begin(), dp.end());
// ์ถ๋ ฅ
cout << n - lis;
return 0;
}
'๐๏ธ ICPC Sinchon > Binary Search' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 1654๋ฒ: ๋์ ์๋ฅด๊ธฐ (0) | 2023.11.17 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 2805๋ฒ: ๋๋ฌด ์๋ฅด๊ธฐ (0) | 2023.11.06 |
[BOJ][C++] ๋ฐฑ์ค 1107๋ฒ: ๋ฆฌ๋ชจ์ปจ (0) | 2023.01.21 |
[BOJ] ๋ฐฑ์ค 2110๋ฒ: ๊ณต์ ๊ธฐ ์ค์น (0) | 2022.10.13 |
[BOJ] ๋ฐฑ์ค 10816๋ฒ: ์ซ์ ์นด๋ 2 (0) | 2022.10.13 |