https://www.acmicpc.net/problem/14002
๐ ์๋ฐ(Java)๋ก ํธ๋ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด 4 - ๋ฐฑ์ค 14002 ๐
์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด(LIS)์ ๊ตฌํ๊ณ , ํด๋น ์์ด์ ์ถ๋ ฅํ๋ผ!
๐ ๋ฌธ์ ๊ฐ์
๋ฐฑ์ค 14002๋ฒ - ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด 4 ๋ฌธ์ ๋
๊ธฐ๋ณธ์ ์ธ LIS(์ต์ฅ ์ฆ๊ฐ ๋ถ๋ถ ์์ด) ๋ฌธ์ ์
๐ “LIS ๊ฒฝ๋ก๊น์ง ์ถ๋ ฅ”์ด ์ถ๊ฐ๋ ๋ฒ์ ์ ๋๋ค.
๐ก ์์ ์ ๋ ฅ
6
10 20 10 30 20 50
๐ก ์์ ์ถ๋ ฅ
4
10 20 30 50
๐ ์๊ณ ๋ฆฌ์ฆ ์ ๊ทผ ๋ฐฉ์
์ด ๋ฌธ์ ๋ ๊ธฐ๋ณธ LIS ๋ฌธ์ ์์
“LIS์ ๊ฒฝ๋ก๋ฅผ ์ ์ฅ”ํด์ผ ํ๊ธฐ ๋๋ฌธ์
โ ๋จ์ํ DP ๋ฐฐ์ด๋ฟ ์๋๋ผ
โ prev[] (์ด์ ์ธ๋ฑ์ค), lastIndex[] (๊ธธ์ด๋ณ ๋ง์ง๋ง ์ธ๋ฑ์ค) ์ถ์ ์ด ํ์ํฉ๋๋ค.
๐น ํต์ฌ ๊ตฌํ ์ค๋ช
๐ ๋ฐฐ์ด ๊ตฌ์กฐ
int[] arr = new int[N]; // ์
๋ ฅ ์์ด
int[] list = new int[N + 1]; // LIS ์์ด (๊ฐ ๊ธฐ์ค)
int[] dp = new int[N]; // arr[i]๊ฐ LIS์ ๋ช ๋ฒ์งธ์ ์๋์ง
int[] prev = new int[N]; // LIS ๊ฒฝ๋ก ์ถ์ ์ฉ ์ด์ ์ธ๋ฑ์ค
int[] lastIndex = new int[N];// ๊ธธ์ด๋ณ ๋ง์ง๋ง ์ธ๋ฑ์ค
- list: ์ค์ LIS๋ฅผ ๋ด์ง๋ ์์ง๋ง, ๊ฐ ๊ธฐ์ค์ผ๋ก ์ถ์
- dp[i]: arr[i]๊ฐ LIS์์ ๋ช ๋ฒ์งธ ์์น์ธ์ง
- prev[i]: ๊ฒฝ๋ก ์ถ์ ์ฉ ํฌ์ธํฐ
- lastIndex[len]: ํด๋น ๊ธธ์ด์์์ ๋ง์ง๋ง ์ธ๋ฑ์ค
๐ LIS ๋ก์ง
if (val > list[top]) {
list[++top] = val;
dp[i] = top + 1;
prev[i] = lastIndex[top - 1];
lastIndex[top] = i;
}
โ ์ฆ๊ฐํ๋ ๊ฒฝ์ฐ, list์ ๋ค์ ๊ฐ์ ์ถ๊ฐ
โ ์ด์ ์ธ๋ฑ์ค ์ถ์ (prev[i])
โ ํด๋น ๊ธธ์ด์ ๋ง์ง๋ง ์์น ๊ฐฑ์
๐ ์ด์ง ํ์์ผ๋ก ๊ฐฑ์
int left = 0, right = top;
while (left < right) {
int mid = (left + right) / 2;
if (list[mid] >= val)
right = mid;
else
left = mid + 1;
}
โ val์ ๋์ฒดํ ์์น๋ฅผ ์ฐพ์์
โ LIS๋ฅผ ๊ฐฑ์ (๊ธธ์ด๋ ์ ์ง)
๐ LIS ๊ธธ์ด ๋ฐ ์์ด ์ถ๋ ฅ
System.out.println(top + 1);
LinkedList<Integer> result = new LinkedList<>();
int idx = lastIndex[top];
while (idx != -1) {
result.addFirst(arr[idx]);
idx = prev[idx];
}
โ lastIndex[top]๋ถํฐ prev[]๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ๊ฒฝ๋ก๋ฅผ ๊ตฌ์ฑ
โ ์ ๋ต ์์ด์ ์ญ์ถ์ → ์์์๋ถํฐ ์ถ๋ ฅ
๐ ์ ๋ฆฌ
โ ํต์ฌ ํฌ์ธํธ
- LIS์์ ๋จ์ ๊ธธ์ด ๋ฟ๋ง ์๋๋ผ ๊ตฌ์ฑ ๊ฒฝ๋ก ์ถ์ ์ด ํ์ํ ๋ฌธ์
- prev[], lastIndex[] ํ์ฉํ์ฌ ๊ฒฝ๋ก๊น์ง ๋ณต์
- ์ด์ง ํ์ ๊ธฐ๋ฐ LIS (O(N log N)) + ์ญ์ถ์ ์ผ๋ก ํด๊ฒฐ
์ด ๋ฌธ์ ๋ LIS ๊ณ์ด ์ค์์๋ ์ถ๋ ฅ๊น์ง ํ์ํ ํ์ฅํ ๋ฌธ์ ๋ก ์ค์ ๋๋น/์ฐ์ต์ฉ์ผ๋ก ์์ฃผ ์ข์๊ฒ ๊ฐ์ต๋๋ค ๐
'Algorithm & Data Structures > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
b2618. ๊ฒฝ์ฐฐ์ฐจ (0) | 2025.04.18 |
---|---|
b14003. ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด 5 (0) | 2025.04.16 |
b12852. 1๋ก ๋ง๋ค๊ธฐ 2 (0) | 2025.04.14 |
b1450. ๋ ์๋ฌธ์ (1) | 2025.04.10 |
b3665. ์ต์ข ์์ (0) | 2025.04.09 |