728x90
๐๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐ง๐ป๐ปํ์ด ๊ณผ์
์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด(LIS) ์๊ณ ๋ฆฌ์ฆ์ ์ ์๊ฒ ์ฒ์ ์ ํด๋ณด๋ ๊ฐ๋ ์ด์์ต๋๋ค. ๊ทธ๋์ ํด๋น ๊ฐ๋ ์ ๋ํด ๋จผ์ ๊ณต๋ถํ์๊ณ , ๊ธฐ์กด \( O(n^2) \)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ง ํ์(Binary Search)์ ํ์ฉํ์ฌ \( O(nlogn) \)์ผ๋ก ์ค์ด๋ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์๊ฒ ๋์์ต๋๋ค.
๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
- ์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด ์ซ์๋ค์ ๋ด์ ๋ฐฐ์ด์ ์ค๋นํ๋ค.
- ์
๋ ฅ๋ ์ซ์์ ๋ํ์ฌ, ๋ค์ ๊ณผ์ ์ ์งํํ๋ค.
- ๋ฐฐ์ด์ด ๋น์๊ฑฐ๋, ๋ฐฐ์ด์ ๋ง์ง๋ง ์์๋ณด๋ค ์ ๋ ฅ๋ ์ซ์๊ฐ ํฌ๋ค๋ฉด, ๋ฐฐ์ด์ ๋ง์ง๋ง ์์ ๋ค์ ์ถ๊ฐํ๋ค.
- ๊ทธ๊ฒ ์๋๋ผ๋ฉด, ์ด์ง ํ์์ ํตํด ์
๋ ฅ๋ ์ซ์๊ฐ ๋ค์ด๊ฐ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ์ฐพ๋๋ค.
- ํด๋น ์ธ๋ฑ์ค์ ์ ๋ ฅ๋ ์ซ์๋ฅผ ์ ์ฅํ๋ค.
๋ฐฐ์ด์ ๋ง์ง๋ง ์์ ์ธ๋ฑ์ค๋ฅผ i๋ผ๊ณ ํ๋ฉด, ๊ธฐ์กด \(O(n^2) \) ์๊ณ ๋ฆฌ์ฆ์ 0 ~ i - 1๊น์ง ์๋ก ์ ๋ ฅ๋ ์ซ์์ ๋น๊ตํ์ฌ ๋ค์ด๊ฐ ์๋ฆฌ๋ฅผ ์ฐพ์๋๋ฐ, ์ด๊ฑธ ์ด์ง ํ์์ ํ์ฉํ์ฌ ํ์ ์๊ฐ์ ํฌ๊ฒ ์ค์๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
์ข ์ข ์ ์ฉํ๊ฒ ์ฐ์ผ ๊ฒ ๊ฐ์, ์์๋๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค์!
โ๏ธ์์ค ์ฝ๋ ๋ฐ ๊ฒฐ๊ณผ
#include <iostream>
#include <vector>
#include <algorithm>
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
using namespace std;
int GetIndexWithBinarySearch(const vector<int>& sequence, int data)
{
if (sequence.empty())
return 0;
return lower_bound(sequence.begin(), sequence.end(), data) - sequence.begin();
}
int main()
{
FAST_IO;
int N;
cin >> N;
vector<int> sequence;
for (int i = 0; i < N; i++)
{
int data;
cin >> data;
int index = GetIndexWithBinarySearch(sequence, data);
if (index < sequence.size())
sequence[index] = data;
else
sequence.push_back(data);
}
cout << sequence.size();
return 0;
}
728x90
๋ฐ์ํ
'๐คAlgorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 1992๋ฒ | ์ฟผ๋ํธ๋ฆฌ (C++) (0) | 2023.08.31 |
---|---|
[BOJ] 2630๋ฒ | ์์ข ์ด ๋ง๋ค๊ธฐ (C++) (0) | 2023.08.31 |
[BOJ] 25682๋ฒ | ์ฒด์คํ ๋ค์ ์น ํ๊ธฐ 2 (C++) (0) | 2023.08.29 |
[BOJ] 11660๋ฒ | ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 5 (C++) (0) | 2023.08.29 |
[BOJ] 2559๋ฒ | ์์ด (C++) (0) | 2023.08.27 |