Algorithm & Data Structures/BOJ

b14003. ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด 5

Geisha 2025. 4. 16. 17:52

 

https://www.acmicpc.net/problem/14003

 

 

 

๐Ÿ“Œ ์ž๋ฐ”(Java)๋กœ ํ‘ธ๋Š” ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด 5 - ๋ฐฑ์ค€ 14003 ๐Ÿ”ผ

LIS + ๊ฒฝ๋กœ ์ถ”์ ์„ O(N log N)์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋Œ€ํ‘œ ๋ฌธ์ œ

 

 

๐Ÿ”Ž ๋ฌธ์ œ ๊ฐœ์š”

๋ฐฑ์ค€ 14003๋ฒˆ - ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด 5 ๋ฌธ์ œ๋Š”

์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ,

 

  1. ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด
  2. ํ•ด๋‹น ๋ถ€๋ถ„ ์ˆ˜์—ด ์ž์ฒด

 

๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋‹จ, ์ˆ˜์—ด์˜ ๊ธธ์ด๊ฐ€ ์ตœ๋Œ€ 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๋ณด๋‹ค ์ž…๋ ฅ ์‚ฌ์ด์ฆˆ๊ฐ€ ํฌ๋ฏ€๋กœ ํšจ์œจ์„ฑ ํ•„์ˆ˜