๐Ÿ‘ป ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ์ตœ๋Œ€ ๋ถ€๋ถ„ ์ฆ๊ฐ€ ์ˆ˜์—ด(LIS)

์กฐํ˜„์ˆ˜ยท2023๋…„ 2์›” 14์ผ
0

โšฝ ์ตœ๋Œ€ ๋ถ€๋ถ„ ์ฆ๊ฐ€์ˆ˜์—ด

์›์†Œ๊ฐ€ n๊ฐœ์ธ ๋ฐฐ์—ด์˜ ์ผ๋ถ€ ์›์†Œ๋ฅผ ๊ณจ๋ผ๋‚ด์„œ ๋งŒ๋“  ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘ ๊ฐ ์›์†Œ๊ฐ€ ์ด์ „ ์›์†Œ๋ณด๋‹ค ํฌ๋‹ค๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๊ณ , ๊ทธ ๊ธธ์ด๊ฐ€ ์ตœ๋Œ€์ธ ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ์ตœ๋Œ€ ๋ถ€๋ถ„ ์ฆ๊ฐ€์ˆ˜์—ด(์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด)์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๊ฐ€ ์–ผ๋งˆ์ธ์ง€ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์€ DP๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๋ฌธ์ œ์˜ ์œ ํ˜•์€ DP ๋ฌธ์ œ๋กœ ์ž์ฃผ ๋‚˜์˜ค๋Š” ์œ ํ˜•์ด๋ฉฐ, O(N^2) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ O(NlogN)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋‹ค.

  • ๋‹น์—ฐํžˆ ์–ด๋ ค์šด ๋ฌธ์ œ๋Š” NlogN์„ ์š”๊ตฌ...

๋ฌธ์ œ์™€ ํ•จ๊ป˜ ์ดํ•ดํ•ด๋ณด์ž.

์ตœ๋Œ€ ๋ถ€๋ถ„ ์ฆ๊ฐ€์ˆ˜์—ด

N๊ฐœ์˜ ์ž์—ฐ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ทธ ์ค‘์—์„œ ๊ฐ€์žฅ ๊ธธ๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š”(์ž‘์€ ์ˆ˜์—์„œ ํฐ ์ˆ˜๋กœ) ์›์†Œ๋“ค์˜ ์ง‘ํ•ฉ์„ ์ฐพ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์›์†Œ๊ฐ€ 2, 7, 5, 8, 6, 4, 7, 12, 3 ์ด๋ฉด ๊ฐ€์žฅ ๊ธธ๊ฒŒ ์ฆ๊ฐ€ํ•˜๋„๋ก ์›์†Œ๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ ๋ฝ‘์•„๋‚ด๋ฉด 2, 5, 6, 7, 12๋ฅผ ๋ฝ‘์•„๋‚ด์–ด ๊ธธ์ด๊ฐ€ 5์ธ ์ตœ๋Œ€ ๋ถ€๋ถ„ ์ฆ๊ฐ€์ˆ˜์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

โ–ฃ ์ž…๋ ฅ์„ค๋ช…
์ฒซ์งธ ์ค„์€ ์ž…๋ ฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ˆ˜ N(2โ‰คNโ‰ค1,000, ์ž์—ฐ์ˆ˜)๋ฅผ ์˜๋ฏธํ•˜๊ณ ,
๋‘˜์งธ ์ค„์€ N๊ฐœ์˜ ์ž…๋ ฅ๋ฐ์ดํ„ฐ๋“ค์ด ์ฃผ์–ด์ง„๋‹ค.

โ–ฃ ์ถœ๋ ฅ์„ค๋ช…
์ฒซ ๋ฒˆ์งธ ์ค„์— ๋ถ€๋ถ„์ฆ๊ฐ€์ˆ˜์—ด์˜ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

โ–ฃ ์ž…๋ ฅ์˜ˆ์ œ 1
8
5 3 7 8 6 2 9 4

โ–ฃ ์ถœ๋ ฅ์˜ˆ์ œ 1
4

import sys
# sys.stdin = open("input.text", "rt")

n = int(input())
data = list(map(int, input().split()))
data.insert(0,0) #1๋ฒˆ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•ž์— ์‚ฝ์ž…
dp = [0] * (n+1)
dp[1] = 1 #๊ฐ๊ด€์ ์œผ๋กœ ์ž๋ช…ํ•œ๊ฑด ๋ฏธ๋ฆฌ ์“ฐ์ž

res = 0
for i in range(2,n+1):
    max_length = 0
    for j in range(1,i): #i๋ณด๋‹ค ์•ž์—๊นŒ์ง€ ๋Œ๋ฉด์„œ ์ตœ์žฅ ๋ถ€๋ถ„ ์ฆ๊ฐ€์ˆ˜์—ด ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
        if data[j] < data[i] and dp[j] > max_length: #data[i]์˜ ๊ฐ’, ์ฆ‰ i๋ฒˆ์งธ ์ˆซ์ž๊ฐ€ ๋‚ด๊ฐ€ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ์ฆ๊ฐ€์ˆ˜์—ด์˜ ๋งˆ์ง€๋ง‰ ํ•ญ์„ ์˜๋ฏธํ•ด
            max_length = dp[j] #dp[j]๋Š” data[j], ์ฆ‰j๋ฒˆ์งธ ํ•ญ์ด ๋งˆ์ง€๋ง‰ ํ•ญ์ธ ์ฆ๊ฐ€์ˆ˜์—ด์˜ ์ตœ๋Œ€ ๊ธธ์ด
    dp[i] = max_length + 1
    if dp[i] > res:
        res = dp[i]

print(res)

๐Ÿ‘ป ์ฝ”๋ฉ˜ํŠธ

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด n๊ฐœ์˜ ์ž์—ฐ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์—ด์—์„œ ๊ฐ€์žฅ ๊ธธ๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š” (์ž‘์€ ์ˆ˜์—์„œ ํฐ ์ˆ˜๋กœ) ์›์†Œ๋“ค์˜ ์ง‘ํ•ฉ์„ ์ฐพ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

๋ฌธ์ œ์˜ ์ƒ๊ฐ์˜ ์‹œ์ž‘์€ "๊ธฐ์ค€"์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ผ๋‹จ ์กฐ๊ฑด์—์„œ ์ด๋™ ์•ˆ๋˜๋Š”๊ฑฐ ์„ค๋ช…ํ–ˆ์Œ.

โšฝ ์ฒ˜์Œ์— ๋ฐ”ํ…€์—… ๋ฐฉ์‹์œผ๋กœ (์ผ๋‹จ dp๋ฌธ์ œ๋ผ๋Š” ๊ฑด ํŒŒ์•…ํ–ˆ๋‹ค๋Š” ์ „์ œ) ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ๋กœ ์ตœ์†Œํ™” ์‹œํ‚จ ํ›„์— ์ ์  ํ™•์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€์–ด์•ผ ํ•˜๋‹ˆ๊น ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ํ•ด๋‹น ์ˆซ์ž๊นŒ์ง€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆ˜์—ด ์ค‘์— ์ฆ๊ฐ€ํ•˜๋Š” ์ˆ˜์—ด์„ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค.

โšฝ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์–ด์ง„ ์˜ˆ์ œ์ฒ˜๋Ÿผ 5 3 7 8 6 2 9 4 ์˜ ์ˆ˜์—ด์ด ์ฃผ์–ด์ง€๋ฉด...

  • ๋จผ์ € ์ฒซ๋ฒˆ์งธ ์ˆซ์ž์ธ 5๊ฐ€ ๋‚ด๊ฐ€ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ์ฆ๊ฐ€์ˆ˜์—ด์˜ ๋งˆ์ง€๋ง‰ ํ•ญ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ฐ€์žฅ ๊ธธ๊ฒŒ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆ˜์—ด์„ ๋งŒ๋“ค๋ฉด [5] ํ•˜๋‚˜์ด๋‹ค.
  • ๋‘๋ฒˆ์งธ ์ˆซ์ž์ธ 3์ด ๋‚ด๊ฐ€ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ์ฆ๊ฐ€์ˆ˜์—ด์˜ ๋งˆ์ง€๋ง‰ ํ•ญ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์•ž์— ์ˆซ์ž 5๋Š” 3๋ณด๋‹ค ํฌ๋‹ˆ๊น ์•ˆ๋ผ. ๊ทธ๋Ÿฌ๋‹ˆ ๋‘๋ฒˆ์งธ๊นŒ์ง€๋„ [3]๋งŒ ๊ฐ€๋Šฅ.
  • 7์ด ๋‚ด๊ฐ€ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ์ฆ๊ฐ€์ˆ˜์—ด์˜ ๋งˆ์ง€๋ง‰ ํ•ญ์ด๋ผ๋ฉด, ์ด์ „ ํ•ญ 3์ด ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ 3์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•ด์„œ ๋งŒ๋“œ๋Š” ์ฆ๊ฐ€์ˆ˜์—ด์ด ๋ช‡๊ฐœ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค !
    • ๊ทธ ๋‹ค์Œ ์•ž์œผ๋กœ ์ „์ง„ํ•ด์„œ 5 ์—ญ์‹œ ๋‚ด๊ฐ€ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ์ฆ๊ฐ€์ˆ˜์—ด ์•ž์— ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— 5๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•˜๋Š” ์ฆ๊ฐ€์ˆ˜์—ด์— ๋”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— [5,7], [3,7]์ด ์กด์žฌํ•œ๋‹ค.
  • ๋‹ค์Œ ํ•ญ์ธ 8์ด ๋‚ด๊ฐ€ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ์ฆ๊ฐ€์ˆ˜์—ด์˜ ๋งˆ์ง€๋ง‰ ํ•ญ์ด๋ผ๊ณ  ๋ณด๋ฉด, ์•ž์œผ๋กœ ๊ฐ€๋ฉด์„œ 7,3,5 ๋ชจ๋‘ ์•ž์— ์˜ฌ ์ˆ˜ ์žˆ๋‹ค ! ๊ทธ๋ ‡๊ธฐ์— 7์„ ๋งˆ์ง€๋ง‰ ํ•ญ์œผ๋กœ ํ•˜๋Š” ์ฆ๊ฐ€์ˆ˜์—ด์— ๋ถ™์ด๊ฑฐ๋‚˜, 3์„ ๋งˆ์ง€๋ง‰ ํ•ญ์œผ๋กœ ํ•˜๋Š” ์ฆ๊ฐ€์ˆ˜์—ด์— ๋ถ™์ด๊ฑฐ๋‚˜, 5๋ฅผ ๋งˆ์ง€๋ง‰ ํ•ญ์œผ๋กœ ํ•˜๋Š” ์ฆ๊ฐ€์ˆ˜์—ด์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค.

โšฝ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ ์  ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ™•์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€์–ด๋‚˜๊ฐ€๋Š” ๋ฌธ์ œ !! ์ตœ๋Œ€ ๋ถ€๋ถ„ ์ฆ๊ฐ€ ์ˆ˜์—ด ๋ฌธ์ œ์ด๋‹ค ! (์—ญ์‹œ dp๋ฌธ์ œ์˜ ํ•œ ์ข…๋ฅ˜)

dp ํ…Œ์ด๋ธ”์— ๊ฐ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ๊ฐ’์€ ํ•ด๋‹น ์ˆซ์ž๋ฅผ ๋งˆ์ง€๋ง‰ ํ•ญ์œผ๋กœ ํ•˜๋Š” ์ฆ๊ฐ€์ˆ˜์—ด ์ค‘ ๊ฐ€์žฅ ๊ธด ๊ธธ์ด๋ฅผ ์ €์žฅํ•˜๋ฉด ๋๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ์ „์ฒด ์ˆ˜์—ด์„ ์ญ‰ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค !!

  • ๊ทธ๋ฆฌ๊ณ  ์ €์žฅ๋œ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆซ์ž์•ผ!
for i in range(2,n+1):
    max_length = 0
    for j in range(1,i):
        if data[j] < data[i] and dp[j] > max_length: #data[i]์˜ ๊ฐ’, ์ฆ‰ i๋ฒˆ์งธ ์ˆซ์ž๊ฐ€ ๋‚ด๊ฐ€ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ์ฆ๊ฐ€์ˆ˜์—ด์˜ ๋งˆ์ง€๋ง‰ ํ•ญ์„ ์˜๋ฏธํ•ด
            max_length = dp[j] #dp[j]๋Š” data[j], ์ฆ‰j๋ฒˆ์งธ ํ•ญ์ด ๋งˆ์ง€๋ง‰ ํ•ญ์ธ ์ฆ๊ฐ€์ˆ˜์—ด์˜ ์ตœ๋Œ€ ๊ธธ์ด
    dp[i] = max_length + 1
    if dp[i] > res:
        res = dp[i]

โšฝ ์•„๊นŒ ๋งํ–ˆ๋˜ ๋Œ€๋กœ i๋ฒˆ์งธ ์•ž์—๊นŒ์ง€ ์ฆ๊ฐ€์ˆ˜์—ด์˜ ์ตœ๋Œ€๊ธธ์ด + 1์ด๋ฏ€๋กœ i-1๊นŒ์ง€ ๋Œ๋ฉด์„œ dp์˜ ์ตœ๋Œ€๊ฐ’์„ ์ฐพ์•„. dp[j]๋Š” j๋ฒˆ์งธ ํ•ญ์ด ๋งˆ์ง€๋ง‰ ํ•ญ์ธ ์ฆ๊ฐ€์ˆ˜์—ด์˜ ์ตœ๋Œ€๊ธธ์ด. ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ์ฐพ์€ ๊ฐ’์— + 1์„ ํ•ด์ฃผ๋ฉด i๋ฒˆ์งธ๊ฐ€ ๋งˆ์ง€๋ง‰ ํ•ญ์ธ ์ฆ๊ฐ€์ˆ˜์—ด์˜ ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ ์ €์žฅ ๋ผ.

  • ๊ทธ๋ฆฌ๊ณ  ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ์ €์žฅ๋œ dp ๋ฆฌ์ŠคํŠธ์˜ ์ตœ๋Œ“๊ฐ’์ด์•ผ! ๊ทธ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€์ˆ˜์—ด์˜ ๊ธธ์ด์ด๊ธฐ ๋•Œ๋ฌธ.

O(N^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„

์œ„์—์„œ ํ’€์–ด๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ฐ”๋กœ O(N^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์˜€๋‹ค.
O(N^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฝค๋‚˜ ๊ฐ„๋‹จํ–ˆ๋‹ค.





O(NlogN)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ - ์ด๋ถ„ ํƒ์ƒ‰ ์ด์šฉ

์œ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐฐ์—ด์˜ ์›์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ํƒ์ƒ‰ํ•˜๋ฉด์„œ, ๊ทธ ์ด์ „์˜ ์›์†Œ๋“ค์„ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(N^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค. ๋”ฐ๋ผ์„œ n์ด 10000๋ณด๋‹ค ์ปค์ง€๋ฉด ์‹œ๊ฐ„์ด ๋งค์šฐ ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ด๋‹ค...

x = int(input())
arr = list(map(int, input().split()))

dp = [1 for i in range(x)]

for i in range(x):
    for j in range(i):
        if arr[i] > arr[j]:
            dp[i] = max(dp[i], dp[j] + 1)

max_dp = max(dp)
print(max_dp)

max_idx = dp.index(max_dp)
lis = []

while max_idx >= 0:
    if dp[max_idx] == max_dp:
        lis.append(arr[max_idx])
        max_dp -= 1
    max_idx -= 1

lis.reverse()
print(*lis)
  • max_dp๋Š” ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€์ˆ˜์—ด์˜ ๊ธธ์ด
  • max_idx๋Š” max_dp์˜ ์œ„์น˜
  • lis๋Š” ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€์ˆ˜์—ด์„ ๋‹ด์„ ๋ฐฐ์—ด

โšฝ max_idx์˜ ๊ฐ’๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๊ฑฐ๊พธ๋กœ ์ˆœํšŒํ•˜๋ฉฐ arr์˜ ์›์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.
max_dp๊ฐ€ 4๊ณ , max_idx๋Š” 5์ด๋ฏ€๋กœ arr[5] = 10์—์„œ๋ถ€ํ„ฐ ๊ฑฐ๊พธ๋กœ ์ˆœํšŒํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋‹ค์Œ์œผ๋กœ ์˜ฌ ์›์†Œ๋Š” arr[4] = 5, arr[3] = 2, arr[0] = 1์ด ๋œ๋‹ค.
lis = [10, 5, 2, 1]์ด๋ฉฐ ์ด๊ฑธ ๋’ค์ง‘์–ด์„œ ์ถœ๋ ฅํ•˜๋ฉด ์›ํ•˜๋Š” ์ •๋‹ต์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ LIS ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค. ์—ฌ๊ธฐ์„œ ํ’€์ดํ•œ ๋ฌธ์ œ๋“ค ๋ง๊ณ ๋„ ๊ด€๋ จํ•œ ๋ฌธํ•ญ๋“ค์ด ๋” ์žˆ์œผ๋‹ˆ ํ•ด๋‹น ๋ฌธ์ œ๋“ค๋„ ๋„์ „ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๐Ÿ‘ป LIS ํ™œ์šฉํ•œ ๋ฌธ์ œ

๐Ÿ’จ ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ํ™œ์šฉํ•œ ๋ฌธ์ œ๋“ค์„ ํ’€์–ด๋ณด๋ฉด์„œ ์–ด๋–ค ์œ ํ˜•์ผ ๋•Œ ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜(dp)๋ฅผ ์จ์•ผํ• ์ง€ ์ƒ๊ฐํ•ด๋ณด์ž.

์ตœ๋Œ€ ์„  ์—ฐ๊ฒฐํ•˜๊ธฐ

์™ผ์ชฝ์˜ ๋ฒˆํ˜ธ์™€ ์˜ค๋ฅธ์ชฝ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์žˆ๋Š” ๊ทธ๋ฆผ์—์„œ ๊ฐ™์€ ๋ฒˆํ˜ธ๋ผ๋ฆฌ ์„ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์™ผ์ชฝ๋ฒˆํ˜ธ๋Š” ๋ฌด์กฐ๊ฑด ์œ„์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋‚˜์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.์˜ค๋ฅธ์ชฝ์˜ ๋ฒˆํ˜ธ ์ •๋ณด๊ฐ€ ์œ„๋ถ€ํ„ฐ ์•„๋ž˜ ์ˆœ์„œ๋กœ ์ฃผ์–ด์ง€๋งŒ ์„œ๋กœ ์„ ์ด ๊ฒน์น˜์ง€ ์•Š๊ณ  ์ตœ๋Œ€ ๋ช‡๊ฐœ์˜ ์„ ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

์œ„์˜ ๊ทธ๋ฆผ์€ ์˜ค๋ฅธ์ชฝ ๋ฒˆํ˜ธ ์ •๋ณด๊ฐ€ 4 1 2 3 9 7 5 6 10 8 ๋กœ ์ž…๋ ฅ๋˜์—ˆ์„ ๋•Œ ์„ ์ด ์„œ๋กœ๊ฒน์น˜์ง€ ์•Š๊ณ  ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์„ ์„ ๊ฐœ์ˆ˜ 6์„ ๊ตฌํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

โ–ฃ ์ž…๋ ฅ์„ค๋ช…
์ฒซ ์ค„์— ์ž์—ฐ์ˆ˜ N(1<=N<=100)์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
๋‘ ๋ฒˆ์งธ ์ค„์— 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ž์—ฐ์ˆ˜ N๊ฐœ์˜ ์˜ค๋ฅธ์ชฝ ๋ฒˆํ˜ธ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ˆœ์„œ๋Š” ์œ„์ชฝ๋ฒˆํ˜ธ ๋ถ€ํ„ฐ ์•„๋ž˜์ชฝ๋ฒˆํ˜ธ ์ˆœ์œผ๋กœ์ž…๋‹ˆ๋‹ค.
โ–ฃ ์ถœ๋ ฅ์„ค๋ช…
์ฒซ ์ค„์— ๊ฒน์น˜์ง€ ์•Š๊ณ  ๊ทธ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

โ–ฃ ์ž…๋ ฅ์˜ˆ์ œ 1
10
4 1 2 3 9 7 5 6 10 8

โ–ฃ ์ถœ๋ ฅ์˜ˆ์ œ 1
6

import sys
sys.stdin = open("input.text", "rt")

#์ตœ๋Œ€ ์„  ์—ฐ๊ฒฐํ•˜๊ธฐ
n = int(input())
data = list(map(int, input().split()))
dp = [0] * n
dp[0] = 1
res = 0
for i in range(1,n):
    max_length = 0
    for j in range(i):
        if data[j] < data[i] and dp[j] > max_length:
            max_length = dp[j]
    dp[i] = max_length + 1 #์ด์ „๊นŒ์ง€์˜ ์ตœ์žฅ๊ฑฐ๋ฆฌ + 1
res = max(dp)
print(res)

ํ•ด๋‹น ๋ฌธ์ œ ์ฝ”๋ฉ˜ํŠธ

์™ผ์ชฝ ์ˆซ์ž๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋‚˜์—ด๋˜์–ด ์žˆ๊ณ , ์˜ค๋ฅธ์ชฝ์€ ์ •๋ ฌ๋˜์–ด ์žˆ์ง€๋Š” ์•Š์Œ..

  • ์„ ์ด ๊ต์ฐจ๋˜์ง€ ์•Š๋„๋ก ์ตœ๋Œ€์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ƒ๊ฐ์œผ๋กœ๋Š” ์˜ค๋ฅธ์ชฝ์—์„œ ์„ ํƒ์„ ํ•  ๊ฒƒ์ธ๋ฐ ๊ฒฐ๊ตญ ์™ผ์ชฝ์€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋‹ˆ ์˜ค๋ฅธ์ชฝ๋„ ์ตœ๋Œ€ํ•œ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋˜์–ด ์žˆ์œผ๋ฉด ๊ต์ฐจํ•˜์ง€ ์•Š๋Š” ์ตœ๋Œ€ ์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค !

๐Ÿ‘ป ๊ฒฐ๋ก ์€ ์ตœ์žฅ ๋ถ€๋ถ„ ์ฆ๊ฐ€์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์˜€๋˜ ๊ฒƒ์ด๋‹ค.

  • ์ด์ „ ์ฝ”๋“œ์™€ ๋˜‘๊ฐ™์ด ์งœ๋ฉด ๋์ง€๋งŒ, ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ’€ ์ง€๋ฅผ ์ƒ๊ฐํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค.

๊ฐ€์žฅ ๋†’์€ ํƒ‘ ์Œ“๊ธฐ

๋ฐ‘๋ฉด์ด ์ •์‚ฌ๊ฐํ˜•์ธ ์ง์œก๋ฉด์ฒด ๋ฒฝ๋Œ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ‘์„ ์Œ“๊ณ ์ž ํ•œ๋‹ค. ํƒ‘์€ ๋ฒฝ๋Œ์„ ํ•œ ๊ฐœ์”ฉ ์•„๋ž˜์—์„œ ์œ„๋กœ ์Œ“์œผ๋ฉด์„œ ๋งŒ๋“ค์–ด ๊ฐ„๋‹ค. ์•„๋ž˜์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด์„œ ๊ฐ€์žฅ ๋†’์€ ํƒ‘์„ ์Œ“์„ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
(์กฐ๊ฑด1) ๋ฒฝ๋Œ์€ ํšŒ์ „์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ์˜†๋ฉด์„ ๋ฐ‘๋ฉด์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
(์กฐ๊ฑด2) ๋ฐ‘๋ฉด์˜ ๋„“์ด๊ฐ€ ๊ฐ™์€ ๋ฒฝ๋Œ์€ ์—†์œผ๋ฉฐ, ๋˜ํ•œ ๋ฌด๊ฒŒ๊ฐ€ ๊ฐ™์€ ๋ฒฝ๋Œ๋„ ์—†๋‹ค.
(์กฐ๊ฑด3) ๋ฒฝ๋Œ๋“ค์˜ ๋†’์ด๋Š” ๊ฐ™์„ ์ˆ˜๋„ ์žˆ๋‹ค.
(์กฐ๊ฑด4) ํƒ‘์„ ์Œ“์„ ๋•Œ ๋ฐ‘๋ฉด์ด ์ข์€ ๋ฒฝ๋Œ ์œ„์— ๋ฐ‘๋ฉด์ด ๋„“์€ ๋ฒฝ๋Œ์€ ๋†“์„ ์ˆ˜ ์—†๋‹ค.
(์กฐ๊ฑด5) ๋ฌด๊ฒŒ๊ฐ€ ๋ฌด๊ฑฐ์šด ๋ฒฝ๋Œ์„ ๋ฌด๊ฒŒ๊ฐ€ ๊ฐ€๋ฒผ์šด ๋ฒฝ๋Œ ์œ„์— ๋†“์„ ์ˆ˜ ์—†๋‹ค.

โ–ฃ ์ž…๋ ฅ์„ค๋ช…
์ž…๋ ฅ ํŒŒ์ผ์˜ ์ฒซ์งธ ์ค„์—๋Š” ์ž…๋ ฅ๋  ๋ฒฝ๋Œ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ฒฝ๋Œ์˜ ์ˆ˜๋Š” ์ตœ๋Œ€ 100๊ฐœ์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ๋Š” ๊ฐ ์ค„์— ํ•œ ๊ฐœ์˜ ๋ฒฝ๋Œ์— ๊ด€ํ•œ ์ •๋ณด์ธ ๋ฒฝ๋Œ ๋ฐ‘๋ฉด์˜ ๋„“์ด, ๋ฒฝ๋Œ์˜ ๋†’์ด ๊ทธ๋ฆฌ๊ณ  ๋ฌด๊ฒŒ๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ ์–‘์˜ ์ •์ˆ˜๋กœ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ๋ฒฝ๋Œ์€ ์ž…๋ ฅ๋˜๋Š” ์ˆœ์„œ๋Œ€๋กœ 1๋ถ€ํ„ฐ์—ฐ์†์ ์ธ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง„๋‹ค.

โ–ฃ ์ถœ๋ ฅ์„ค๋ช…
์ฒซ ๋ฒˆ์งธ ์ค„์— ๊ฐ€์žฅ ๋†’์ด ์Œ“์„ ์ˆ˜ ์žˆ๋Š” ํƒ‘์˜ ๋†’์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

โ–ฃ ์ž…๋ ฅ์˜ˆ์ œ 1
5
25 3 4
4 4 6
9 2 3
16 2 5
1 5 2

โ–ฃ ์ถœ๋ ฅ์˜ˆ์ œ 1
10

import sys
# sys.stdin = open("input.text", "rt")

#๊ฐ€์žฅ ๋†’์€ ํƒ‘ ์Œ“๊ธฐ
#๋ฐ‘๋ฉด ๋„“์ด, ๋ฒฝ๋Œ ๋ฌด๊ฒŒ๊ฐ€ ์กฐ๊ฑด
#์œ„๋กœ ๊ฐˆ์ˆ˜๋ก ๋„“์ด ์ข๊ณ  ๋ฌด๊ฒŒ ๊ฐ€๋ฒผ์›Œ์•ผ ํ•œ๋‹ค

n = int(input())
data = []
for _ in range(n):
    a,b,c = map(int, input().split()) #๋ฐ‘๋ฉด ๋„“์ด, ๋ฒฝ๋Œ ๋†’์ด, ๋ฌด๊ฒŒ
    data.append((a,b,c))

data.sort() #๋ฐ‘๋ฉด ๋„“์ด๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ -> ์กฐ๊ฑด ํ•˜๋‚˜ ์ œ์™ธ
#์ด์ œ ๋ฒฝ๋Œ ๋ฌด๊ฒŒ๋งŒ ๋’ค๋กœ ๊ฐˆ์ˆ˜๋ก ์ฆ๊ฐ€. ์ฆ‰ ์ตœ์žฅ ๋ถ€๋ถ„ ์ฆ๊ฐ€์ˆ˜์—ด!
dp = [0] * n #๊ฐ ์ธ๋ฑ์Šค ๊ฐ’๊นŒ์ง€์˜ ์ตœ๋Œ€ ์„ธ์šธ ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ˆ˜ 
dp[0] = data[0][1]

for i in range(1,n):
    h = 0
    for j in range(i):
        if data[j][2] < data[i][2] and dp[j] > h:
            h = dp[j] #์ด์ „๊นŒ์ง€์˜ ์ตœ์žฅ๋†’์ด๋ฅผ ์ €์žฅํ•ด๋†“์Œ
    dp[i] = h + data[i][1]

print(max(dp))

ํ•ด๋‹น๋ฌธ์ œ ์ฝ”๋ฉ˜ํŠธ

์กฐ๊ฑด์ด ๋‘๊ฐ€์ง€์˜€๋‹ค. ๋ฒฝ๋Œ์˜ ๋ฐ‘๋ฉด ๋„“์ด, ๋ฒฝ๋Œ์˜ ๋ฌด๊ฒŒ.
๋จผ์ € ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ์กฐ๊ฑด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์•ผ๋งŒ ํ–ˆ๋‹ค. ์กฐ๊ฑด์ด ๋‘๊ฐœ๋ผ ํ•˜๋‚˜๋Š” ๊ณ ์ •์„ ์‹œ์ผœ์ฃผ๊ณ  ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋ฅผ ๋Œ€์กฐํ•˜๋ฉด์„œ ํ’€์—ˆ์–ด์•ผ ํ–ˆ์–ด

  • ๊ทธ๋ฆฌ๊ณ  ๋ฒฝ๋Œ์˜ ๋ฌด๊ฒŒ๋ฅผ ๋ณด๋ฉด ์œ„๋กœ ๊ฐˆ์ˆ˜๋ก ๊ฐ€๋ฒผ์›Œ์•ผ ํ•˜๋ฏ€๋กœ ์ด์ œ ์„ ํƒํ•˜๋Š” ๊ฑด๋ฐ ํ˜„์žฌ ์œ„์น˜์˜ ๋ฒฝ๋Œ์ด ๊ฐ€์žฅ ๊ฐ€๋ฒผ์šด ๋ฌด๊ฒŒ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ตœ์žฅ ๋ถ€๋ถ„ ์ฆ๊ฐ€์ˆ˜์—ด๋กœ ์ ‘๊ทผํ–ˆ์œผ๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค.
profile
back-end, ์ง€์† ์„ฑ์žฅ ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ฐœ์ž๋ฅผ ํ–ฅํ•˜์—ฌ

0๊ฐœ์˜ ๋Œ“๊ธ€