https://www.acmicpc.net/problem/14003
๐ ์๋ฐ(Java)๋ก ํธ๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 5 - ๋ฐฑ์ค 14003 ๐ผ
LIS + ๊ฒฝ๋ก ์ถ์ ์ O(N log N)์ผ๋ก ํด๊ฒฐํ๋ ๋ํ ๋ฌธ์
๐ ๋ฌธ์ ๊ฐ์
๋ฐฑ์ค 14003๋ฒ - ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 5 ๋ฌธ์ ๋
์์ด์ด ์ฃผ์ด์ก์ ๋,
- ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด
- ํด๋น ๋ถ๋ถ ์์ด ์์ฒด
๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
๋จ, ์์ด์ ๊ธธ์ด๊ฐ ์ต๋ 100๋ง ๊ฐ์ด๋ฏ๋ก O(N²) ํ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๐ก ์์ ์ ๋ ฅ
6
10 20 10 30 20 50
๐ก ์์ ์ถ๋ ฅ
4
10 20 30 50
๐ ์๊ณ ๋ฆฌ์ฆ ์ ๊ทผ ๋ฐฉ์
โ ํต์ฌ ์ ๋ต: ์ด์ง ํ์ ๊ธฐ๋ฐ LIS + ๊ฒฝ๋ก ์ถ์
- list[]: ํ์ฌ๊น์ง ๋ง๋ LIS ์์ด (๊ฐ๋ง ์ถ์ )
- dp[i]: arr[i]๊ฐ LIS์ ๋ช ๋ฒ์งธ ์์น์ธ์ง
- prev[i]: LIS ๊ฒฝ๋ก๋ฅผ ์ฌ๊ตฌ์ฑํ๊ธฐ ์ํ ์ด์ ์ธ๋ฑ์ค
- lastIndex[length]: ํด๋น ๊ธธ์ด์ LIS์์ ๋ง์ง๋ง์ผ๋ก ๋ค์ด์จ ์ธ๋ฑ์ค
๐น Java ์ฝ๋ ์ค๋ช
๐ LIS ์ด๊ธฐ๊ฐ ์ค์
list[0] = arr[0];
dp[0] = 1;
prev[0] = -1;
lastIndex[0] = 0;
โ ์ฒซ ๋ฒ์งธ ์์๋ฅผ LIS์ ์์์ผ๋ก ์ค์
๐ LIS ์งํ & ์ด์ง ํ์์ผ๋ก ์์น ๊ณ์ฐ
if (val > list[top]) {
list[++top] = val;
dp[i] = top + 1;
prev[i] = lastIndex[top - 1];
lastIndex[top] = i;
} else {
int left = 0, right = top;
while (left < right) {
int mid = (left + right) / 2;
if (list[mid] >= val) right = mid;
else left = mid + 1;
}
list[left] = val;
dp[i] = left + 1;
prev[i] = (left == 0) ? -1 : lastIndex[left - 1];
lastIndex[left] = i;
}
โ ์์ด์ ์ํํ๋ฉฐ
โ list๋ ๊ฐ๋ง ์ ์ฅํ๊ณ
โ prev, dp, lastIndex๋ฅผ ํตํด ๊ฒฝ๋ก ๋ณต์ ์ ๋ณด ์ ์ฅ
๐ ๊ฒฝ๋ก ๋ณต์
int[] result = new int[top + 1];
int resultIdx = top;
int idx = lastIndex[top];
while (idx != -1) {
result[resultIdx--] = arr[idx];
idx = prev[idx];
}
โ lastIndex[top]์์๋ถํฐ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ๊ฒฝ๋ก ๋ณต์
โ prev[]๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด์ ์์ด ์ญ์ถ์
โ ์ญ์์ผ๋ก ๋ฐฐ์ด์ ์ ์ฅ ํ ์ถ๋ ฅ
๐ ์ ๋ฆฌ
โ ํต์ฌ ํฌ์ธํธ
- O(N log N) LIS ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฝ๋ก ์ถ์ ์ฉ ์ธ๋ฑ์ค ๋ฐฐ์ด ์ถ๊ฐ
- ๋ง์ง๋ง ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ตํด๋๊ณ ์ญ์ถ์ ํ๋ฉด ์ค์ ์์ด๋ ๊ตฌํ ์ ์์
- ๋ฐฑ์ค 14002๋ณด๋ค ์ ๋ ฅ ์ฌ์ด์ฆ๊ฐ ํฌ๋ฏ๋ก ํจ์จ์ฑ ํ์
'Algorithm & Data Structures > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
b13913. ์๊ฐ์ด๋ 4 (0) | 2025.04.22 |
---|---|
b2618. ๊ฒฝ์ฐฐ์ฐจ (0) | 2025.04.18 |
b14002. ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด 4 (0) | 2025.04.15 |
b12852. 1๋ก ๋ง๋ค๊ธฐ 2 (0) | 2025.04.14 |
b1450. ๋ ์๋ฌธ์ (1) | 2025.04.10 |