ย - Last update: 2023-05-23

์ž๊พธ ๊นŒ๋จน๋Š” LIS ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด๊ธฐ

LIS

Longest Increase Sequence ์˜ ์•ฝ์ž. ์ตœ์žฅ ์ฆ๊ฐ€ ์ˆ˜์—ด ๋กœ๋„ ๋ถˆ๋ฆฐ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์€ ์ˆ˜์—ด์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

index0123456
value2314753

์ด ๊ฒฝ์šฐ, ๊ฐ€์žฅ ๊ธธ๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š” sequence๋Š” 2 -> 3 -> 4 -> 7์ด๋ฉฐ, ๊ธธ์ด๋Š” 4๊ฐ€ ๋œ๋‹ค. LIS๋Š” ์ด๋Ÿฌํ•œ ๊ฐ€์žฅ ๊ธด ๊ฒฝ์šฐ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ํ’€์ดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์ž.

DP Solution

DP[j]๋ฅผ j๋ฒˆ์งธ์—์„œ์˜ LIS๋ผ๊ณ  ์ •์˜ํ•˜๋ฉด, DP์˜ ์ผ๋ฐ˜ํ•ญ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ธ์šธ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์—์„œ i๋ฒˆ์งธ๋Š” i < j์ธ ์กฐ๊ฑด์—์„œ ํ™•์ธ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.

if (A[i] < A[j])
DP[j] = max(DP[j], DP[i] + 1);

์—ฌ๊ธฐ์„œ j๋Š” i๋ณด๋‹ค ์ปค์•ผ ํ•œ๋‹ค. (์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ์ด๋ฏ€๋กœ) ๋ฃจํ”„๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

DP[0] = 1; // ์ฒซ๋ฒˆ์งธ ์›์†Œ๋Š” ๋ฌด์กฐ๊ฑด 1์˜ LIS๋ฅผ ๊ฐ€์ง„๋‹ค.
for(int j = 1; j < sz; ++j) { // j๋ฒˆ์งธ๋ฅผ ์ฑ„์šธ ๋•Œ, [0, j)๊นŒ์ง€ ํ™•์ธํ•ด์„œ max ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.
for(int i = 0; i < j; ++i) { // i < j
if (A[i] < A[j])
DP[j] = max(DP[j], DP[i] + 1);
}
}

์—ฌ๊ธฐ์„œ LIS ๊ฒฐ๊ณผ๊ฐ’์€ DP[] ์˜ ์ตœ๋Œ€๊ฐ’ + 1์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n^2)๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

Binary Search Solution

์‚ด์ง Trickyํ•œ ๋ฐฉ์‹์ด๋‹ค. ์œ„์—์„œ 2์ค‘ ํฌ๋ฌธ์„ ๋„๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€? ๊ทธ๊ฒƒ์€ DP ๋ฐฐ์—ด์˜ ์—…๋ฐ์ดํŠธ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋งŒ์•ฝ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์„ธ๋Š” ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜์„œ, A[i] < A[j]์ธ ์กฐ๊ฑด์„ ์ง์ ‘์ ์œผ๋กœ DP ๋ฐฐ์—ด์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด? ๊ทธ ๊ฒฝ์šฐ์—๋Š” ์ตœ์ข…์ ์œผ๋กœ DP ๋ฐฐ์—ด์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋‹ต์ด ๋  ๊ฒƒ์ด๋‹ค.

๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ ๋ฐฉ์‹์€ Binary Search๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฐ ์›์†Œ์— ๋Œ€ํ•ด์„œ Binary Search๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ DP ๋ฐฐ์—ด์— ๋„ฃ์œผ๋ฉด ๋˜๊ณ , ์ด ๊ฒฝ์šฐ ์ „์ฒด ๋ฐฐ์—ด์„ 1ํšŒ๋งŒ scan ํ•˜๋ฉด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n log n)์ด ๋œ๋‹ค. ์ด์ •๋„ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n^2)์— ๋น„ํ•ด ์ƒ๋‹นํžˆ ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

vector<int> DP;
for(int i = 0; i < sz; ++i) {
auto it = lower_bound(DP.begin(), DP.end(), A[i]);
if (it == DP.end()) {
DP.push_back(A[i]);
} else {
*it = A[i];
}
}

์—ฌ๊ธฐ์„œ LIS ๊ฒฐ๊ณผ๊ฐ’์€ DP ๋ฐฐ์—ด์˜ size๊ฐ€ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ DP์˜ ๊ด€์ ์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ํฌ๊ฒŒ ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ ์ด ๋ฐฉ๋ฒ•์—์„œ ์‹ค์ œ LIS๋ฅผ ์ด๋ฃจ๋Š” ๋ฐฐ์—ด์„ ์•Œ์•„์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, push_back ๋˜๋Š” ์‹œ์ ์˜ ์›์†Œ๋“ค๋กœ ๊ตฌ์„ฑํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

๐Ÿท๏ธ ์ฃผ์ œ ๋ชฉ๋ก: