12738์ค๋์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 1, 2, 3, 4, 5๋ฅผ ๋ชจ๋ ํ์ด๋ณผ๊ฒ๋๋ค.
์ด ๋ฌธ์ ๋ค์ ๋ค ํ์๋ค๋ฉด ์์ฐ์ค๋ฝ๊ฒ 11055๋ฒ ๊ฐ์ฅ ํฐ ์ฆ๊ฐ ๋ถ๋ถ ์์ด๊ณผ 11054๋ฒ ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด์ ์ฝ๊ฒ ํ์ ์์๊ฒ๋๋ค.
์ ๋ ๋จ๊ณ๋ณ๋ก ํ์ด๋ณด๊ธฐ์์ ์ด๋ถ ํ์์ ํ๋ฉด์ ์ฐ๊ด๋ ๋ฌธ์ ๊ทธ๋ฅ ๋ค ํ์ด๋ณด์ ํ๋ ๋ง์์ผ๋ก ํ์ด๋ณด์๊ณ , ๋ง์ ๋ธ๋ก๊ทธ๋ ๋ณด๊ณ ์ง๋ฌธ ๊ฒ์ํ์ ๋์๋ ๋ฐ์ผ๋ฉด์ ํ์์ต๋๋ค.
์ ์ด์ ๊ทธ๋ผ ํ์ด๋ด ์๋ค.
โ๋ฌธ์ โ
์์ด A๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์๋ฅผ ๋ค์ด, ์์ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์ฐ์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ A = {10, 20, 10, 30, 20, 50} ์ด๊ณ , ๊ธธ์ด๋ 4์ด๋ค.
11053๋ฒ - ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 1 ( https://www.acmicpc.net/problem/11053 )
๐น์ ๋ ฅ๐น
์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000)์ด ์ฃผ์ด์ง๋ค.๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ Ai ≤ 1,000)
๐น์ถ๋ ฅ๐น
์ฒซ์งธ ์ค์ ์์ด A์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
12015๋ฒ - ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 2 ( https://www.acmicpc.net/problem/12015 )
๐น์ ๋ ฅ๐น
์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000,000)์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ Ai ≤ 1,000,000)
๐น์ถ๋ ฅ๐น
์ฒซ์งธ ์ค์ ์์ด A์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
12738๋ฒ - ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 3 ( https://www.acmicpc.net/problem/12738 )
๐น์ ๋ ฅ๐น
์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000,000)์ด ์ฃผ์ด์ง๋ค.๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000)
๐น์ถ๋ ฅ๐น
์ฒซ์งธ ์ค์ ์์ด A์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.
14002๋ฒ - ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 4 ( https://www.acmicpc.net/problem/14002 )
๐น์ ๋ ฅ๐น
์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000)์ด ์ฃผ์ด์ง๋ค.๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ Ai ≤ 1,000)
๐น์ถ๋ ฅ๐น
์ฒซ์งธ ์ค์ ์์ด A์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.๋์งธ ์ค์๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ์ถ๋ ฅํ๋ค. ๊ทธ๋ฌํ ์์ด์ด ์ฌ๋ฌ๊ฐ์ง์ธ ๊ฒฝ์ฐ ์๋ฌด๊ฑฐ๋ ์ถ๋ ฅํ๋ค.
14003๋ฒ - ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 5 ( https://www.acmicpc.net/problem/ 14003 )
๐น์ ๋ ฅ๐น
์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000,000)์ด ์ฃผ์ด์ง๋ค.๋์งธ ์ค์๋ ์์ด A๋ฅผ ์ด๋ฃจ๊ณ ์๋ Ai๊ฐ ์ฃผ์ด์ง๋ค. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000)
๐น์ถ๋ ฅ๐น
์ฒซ์งธ ์ค์ ์์ด A์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค.๋์งธ ์ค์๋ ์ ๋ต์ด ๋ ์ ์๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ์ถ๋ ฅํ๋ค.
5๋ฌธ์ ๋ชจ๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์ฃผ์ด์ง์ง๋ง ๋ฌธ์ ์ ์กฐ๊ฑด์ด ์กฐ๊ธ์ฉ ๋ค๋ฅด๊ณ ์ฌ๊ธฐ์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ DP์ ์ด๋ถํ์์ ๋๋ค.
๋นจ๊ฐ์์ DP๋ฅผ ํ๋์์ BS๋ฅผ ์ฌ์ฉํ ๊ฒ๋๋ค. ๋จผ์ ์ด๋์ ์๊ณ ๋ฆฌ์ฆ ์ฐจ์ด๊ฐ ์ค๋์ง ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์์๋ด ์๋ค.
์ผ๋จ DP๋ฌธ์ ๋ถํฐ ํ์ด๋ด ์๋ค.
(1). DP ํ์ด (11053๋ฒ, 14002๋ฒ)
ex) A = {10, 20, 10, 30, 20, 50}
- ๋ชฉํ: DP[idx] ํ์ฌ i ๊น์ง ์ฆ๊ฐํ๋ ์์ด์ ๊ฐ์๋ฅผ ๋ฃ๋๋ค. DP = {1, 2, 1, 3, 2, 4}
- ์ฆ๊ฐํ ๋ ์ด์ ์ ์ธ๋ฑ์ค๋ฅผ ๋ฃ์ด์ค๋ค. V = {-1, 0, -1, 1, 0, 3}
- ์์ ํ์ํ๋ฉด์ ๊ฐ์ฅ ํฐ DP[idx]๋ฅผ ์ฐพ๋๋ค. → 11053๋ฒ์ ๋ต
- ๊ฐ์ฅ ํฐ DP[idx]์ idx๋ถํฐ V๋ฅผ ํ์ํ๋ฉฐ -1์ด ๋์ฌ๋๊น์ง ํ์ํ์ฌ vector์ ๋ฃ์ด์ค๋ค.
- vector๋ฅผ reverse๋ฅผ ํ๊ฑฐ๋ ํ๋์ฉ ๋นผ(back) ์ถ๋ ฅํ๋ค. → 14002๋ฒ์ ๋ต
๐ 14002๋ฒ ์ฝ๋๐
11053๋ฒ์ size๋ง ์ถ๋ ฅํ๋ฉด ๋๋ฏ๋ก ์ฝ๋ ์๋ตํ์ต๋๋ค.
#include <iostream>
#include <memory.h>
#include <vector>
using namespace std;
int A[1000], DP[1000], V[1000];
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int N;
cin >> N;
for (int i = 0; i < N; ++i)
{
cin >> A[i];
}
int maxCount = 1;
int index = 0;
DP[0] = 1;
memset(V, -1, sizeof(V));
for (int i = 1; i < N; ++i) {
DP[i] = 1;
for (int j = 0; j < i; ++j)
{
if ((A[j] < A[i]) && (DP[i] < DP[j] + 1))
{
DP[i] = DP[i] + 1;
V[i] = j;
if (maxCount < DP[i])
{
maxCount = DP[i];
index = i;
}
}
}
}
cout << maxCount << "\n";
vector<int> vec;
while(V[index] != -1)
{
vec.push_back(A[index]);
index = V[index];
}
vec.push_back(A[index]);
for (int i = vec.size()-1; i >=0; --i)
{
cout << vec[i] << " ";
}
return 0;
}
(2). ์ด๋ถํ์ ํ์ด (12015๋ฒ, 12738๋ฒ, 14003๋ฒ)
์ ๋ ์ด๋ถํ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํธ๋ ์์ด๋์ด๋ ์ ํ ๋ ์ฌ๋ฆฌ์ง ๋ชปํ์ต๋๋ค. ๋ง์ ๋ธ๋ก๊ทธ ํ์ด์ ์ง๋ฌธ๊ฒ์ํ์ ๋ณด๊ณ ์ดํดํ๊ณ ํ์์ต๋๋ค. ์ ๊ฐ ์ดํดํ ๋ด์ฉ์ ๊ทธ๋ฆผ์ผ๋ก ํํํด๋ณด์์ต๋๋ค. ์ดํดํ๋ ๋์ ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.๐ ์ฝ๋์ ๊ฐ์ ๋ณ์์ด๋ฆ์ ๊ฐ์ง๊ณ ์์ผ๋ ์ฝ๋ ๋ณด๋ฉด์ ์ดํดํ์๊ธธ..
ex) A = {10, 20, 5, 30, 15, 50}
- vec ์์ ์ฒซ๋ฒ์งธ A[0]์ ๋ฃ์ด์ค๋ค (A์ ๋น๊ต๋ฅผ ์ํ)
- vec.back() < A[i]๊ฐ true์ด๋ฉด vec์ ํ์ฌ A[i]๋ฅผ ๋ฃ์ด์ฃผ๊ณ (์ฆ๊ฐ ์์ด์ด๊ธฐ๋๋ฌธ์) ๊ฐ์ํ๋ฉด ๊ฐ์์ ๋ณํจ์ด ์๋๋ก ์นํํด์ค๋ค.
- ์ด๋ ์นํํ ์์น๋ฅผ ์ฐพ๊ธฐ ์ํด์ ์ด๋ถํ์์ ์ฌ์ฉํ๋ค. (์ด๋ถํ์์ ํ ์ ์๋ ์ด์ ๋ vec๋ ์ค๋ฅธ์ฐจ์์ผ๋ก ์ ๋ ฌ์ด ๋์ด์๊ธฐ๋๋ฌธ์ด๋ค.์ฌ๊ธฐ์ ๋ง์ฝ ์ ์ ๋ ฌ๋์ด ์์ด์ ์ด๋ถํ์์ ํ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ์ด๋ถํ์์ ๋ค์ ๊ณต๋ถํ๊ณ ์ค์.์ ํฌ๋ธ๋ง ๋ด๋ ์ ๋์ด.)
- 2๋ฒ 3๋ฒ ํ ๋ v ๋ฐฐ์ด์ ํ์ฌ idx์์ A[idx]๊ฐ vec[i] ์ค ์ด๋ i์ ๋ค์ด๊ฐ์ง ๋ฃ์ด์ค๋ค.(vec์ ์กด์ฌํ๋ ์ค์ ์์น 14003๋ฒ์ ์ถ๋ ฅ๊ฐ์ด ๋๋ค.)
- vec์ ํฌ๊ธฐ๋ 12015๋ฒ, 12738๋ฒ์ ์ถ๋ ฅ๊ฐ์ด ๋๋ค.
๐ 14003๋ฒ ๐
12015๋ฒ๊ณผ 12738๋ฒ์ size๋ง ์ถ๋ ฅํ๋ฉด ๋๋ฏ๋ก ์ฝ๋ ์๋ตํ์ต๋๋ค.
#include <iostream>
#include <memory.h>
#include <vector>
#include <algorithm>
using namespace std;
int A[1000000], V[1000000];
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int N;
cin >> N;
for (int i = 0; i < N; ++i)
{
cin >> A[i];
}
vector<int> vec;
vec.push_back(A[0]);
memset(V, -1, sizeof(V));
V[0] = 0;
for (int i = 1; i < N; ++i) {
if (vec.back() < A[i])
{
vec.push_back(A[i]);
V[i] = vec.size() - 1;
}
else
{
int start = 0;
int end = vec.size() - 1;
int mid = end;
while (start < end)
{
mid = (start + end) / 2; // (start = 0 + end = 3) 2 = 1
if (vec[mid] < A[i]) // ex) vec[] = 10,(*)15, 18, 25, 30 <--- push (20)
{
start = mid + 1;
}
else // ex) vec[] = 10, 15, 18,(*)25 30 <--- push (20)
{
end = mid;
}
}
vec[end] = A[i];
V[i] = end;
}
}
//=======================================//
vector<int> _result;
int index = vec.size() - 1;
for (int i = N; i >= 0; --i)
{
if (V[i] == index)
{
_result.push_back(A[i]);
--index;
}
}
//=======================================//
cout << vec.size() << "\n";
reverse(_result.begin(), _result.end());
for (auto& res : _result)
{
cout << res << " ";
}
return 0;
}
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/010.gif)
๋ฐ์ด์ฉ
'๐ coding test > โฝ ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
(๋ฐฑ์ค/ C++) 2629 - ์ํ์ ์ธ (0) | 2024.07.09 |
---|---|
(๋ฐฑ์ค/ C++) 11438 - LCA 2 / ํจ์จ์ ์ธ LCA(+sparse table) (0) | 2023.02.02 |
(๋ฐฑ์ค/ C++) 1450 - ๋ ์๋ฌธ์ , ์ด๋ถ ํ์ ์์ ํ์ ๊ทธ๋ ค๋ณด์! (0) | 2023.01.12 |
(๋ฐฑ์ค/ C++) 2470 - ๋ ์ฉ์ก (0) | 2022.09.06 |
(๋ฐฑ์ค/ C++) 1644 - ์์์ ์ฐ์ ํฉ (0) | 2022.09.06 |
์ ํ๋ ๊ฒ ๋ณด๋ค ๋ซ๊ฒ ์ง
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!