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

2025. 4. 15. 15:53ยทAlgorithm & Data Structures/BOJ

 

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)) + ์—ญ์ถ”์ ์œผ๋กœ ํ•ด๊ฒฐ
์ฒ˜์Œ dp์™€ prev ๋ฐฐ์—ด ์—†์ด ์‹œ๋„ํ•˜๋ คํ–ˆ์œผ๋‚˜ ์—ญ์ถ”์ ์ด ์—†์œผ๋ฉด ์ •ํ™•ํ•œ ๊ตฌ์„ฑ๊ฒฝ๋กœ ๊ฐ€ ๋‚˜์˜ค์ง€์•Š์•„ ์‹œ๊ฐ„์ด ๋งŽ์ด ๋Œ๋ ธ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” 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
'Algorithm & Data Structures/BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • b2618. ๊ฒฝ์ฐฐ์ฐจ
  • b14003. ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด 5
  • b12852. 1๋กœ ๋งŒ๋“ค๊ธฐ 2
  • b1450. ๋ƒ…์ƒ‰๋ฌธ์ œ
Geisha
Geisha
๊ฐœ๋ฐœ ์ผ๊ธฐ
  • Geisha
    Geisha
    Geisha
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (330) N
      • Algorithm & Data Structures (249)
        • BOJ (107)
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (28) N
        • SQL (22) N
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • ์šด์˜์ฒด์ œ (13)
        • ๋„คํŠธ์›Œํฌ (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    Stack
    Java
    SQL
    ๋ฐฑ์ค€
    Dijkstra
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    PriorityQueue
    ๊ณจ๋“œ
    ์ž๋ฐ”
    Union-Find
    programmers
    algorithm
    baekjoon
    BFS
    ๊ฒฝ๋กœ์••์ถ•
    ๋‹ค์ต์ŠคํŠธ๋ผ
    ์ด๋ถ„ํƒ์ƒ‰
    ์œ ๋‹ˆ์˜จํŒŒ์ธ๋“œ
    ์Šคํƒ
    dfs
    ๊ตฌํ˜„
    ๋™์ ๊ณ„ํš๋ฒ•
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    ๋ฐฑํŠธ๋ž˜ํ‚น
    ํˆฌํฌ์ธํ„ฐ
    ์ „์œ„์ˆœํšŒ
    dp
    binarySearch
    ํ›„์œ„์ˆœํšŒ
    DynamicProgramming
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Geisha
b14002. ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด 4
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”