Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Python) 11055๋ฒˆ - ๊ฐ€์žฅ ํฐ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆ˜์—ด (dp ํ’€์ด ๋ฐฉ๋ฒ•)

๊ฐ์ž ๐Ÿฅ” 2023. 4. 1. 17:39
๋ฐ˜์‘ํ˜•

๊ธฐ์—… ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต์œผ๋กœ Swift๊ฐ€ ์•„๋‹ˆ๋ผ Python์œผ๋กœ ํ’€์ดํ–ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜…

 

โšซ๏ธ ๋ฌธ์ œ

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

 

11055๋ฒˆ: ๊ฐ€์žฅ ํฐ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ทธ ์ˆ˜์—ด์˜ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘์—์„œ ํ•ฉ์ด ๊ฐ€์žฅ ํฐ ๊ฒƒ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} ์ธ ๊ฒฝ์šฐ์— ํ•ฉ์ด ๊ฐ€์žฅ ํฐ ์ฆ๊ฐ€ํ•˜๋Š”

www.acmicpc.net

 

โšซ๏ธ ๋‚˜์˜ ํ’€์ด

์ด์ „์— ๋ณด๊ณ ์™€์•ผํ•  ๊ฒƒ์ด ์žˆ๋‹ค. '๊ฐ€์žฅ ํฐ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆ˜์—ด'์€ ์ฃผ์–ด์ง„ ์ˆ˜์—ด ์†์—์„œ '์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด'์„ ์ฐพ๋Š” ๋ฌธ์ œ๋‹ค. LIS๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค.

https://didu-story.tistory.com/236

 

[์•Œ๊ณ ๋ฆฌ์ฆ˜] (Swift) ์ตœ๊ฐ• ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด (LIS) ์•Œ๊ณ ๋ฆฌ์ฆ˜ (DP, ๋™์ ๊ณ„ํš๋ฒ•์„ ํ™œ์šฉํ•œ LIS)

์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด (LIS,Longest Increasing Subsequence) ์ด๋ž€? ์–ด๋–ค ์ž„์˜์˜ ์ˆ˜์—ด์ด ์ฃผ์–ด์งˆ ๋•Œ, ์ด ์ˆ˜์—ด์—์„œ ๋ช‡ ๊ฐœ์˜ ์ˆ˜๋“ค์„ ์ œ๊ฑฐํ•ด์„œ ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ๋งŒ๋“ค์–ด์ง„ ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ

didu-story.tistory.com

๋‚ด๊ฐ€ ์ด๋ ‡๊ฒŒ... ํฌ์ŠคํŒ…๋„ ํ•ด๋†จ๋‹ค. 

๊ธฐ๋ณธ์ ์œผ๋กœ LIS๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์€ ๋‘๊ฐ€์ง€๋‹ค. '์ด๋ถ„ํƒ์ƒ‰'๋ฐฉ์‹์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ 'dp'๋ฅผ ์ด์šฉํ•˜๋Š”๊ฒƒ! ๋‘ ๊ฐœ ๋ชจ๋‘ ์˜ฌ๋ฐ”๋ฅธ ํ’€์ด์ด๊ธด ํ•˜์ง€๋งŒ, ์‹œ๊ฐ„๋ณต์žก๋„์— ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค. dp๋Š” for๋ฌธ์„ ์ด์ค‘์œผ๋กœ ์ค‘์ฒฉํ•ด์„œ ๋งŒ๋“ค๊ธฐ ๋–„๋ฌธ์— O(N^2)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค. ๋ฐ˜๋ฉด์—, ์ด๋ถ„ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•˜๋ฉด O(nlogn)์˜ ์‹œ๊ฐ„์„ ๊ฐ–๋Š”๋‹ค. ๋–„๋ฌธ์—, ์ฃผ์–ด์ง„ N์— ๋Œ€ํ•˜์—ฌ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ณ ๋ คํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผํ•œ๋‹ค.

์œ„ ๋‚ด ํฌ์ŠคํŒ…์—๋Š” dp๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•ด๋’€๋‹ค. ๊ทธ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์ง€๋งŒ, ์ด๋ฒˆ ๋ฌธ์ œ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค. ์ด๋ฒˆ๋ฌธ์ œ์—์„œ๋Š” ๊ฐ€์žฅ ํฐ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ถ€๋ถ„์ˆ˜์—ด๋“ค ์ค‘์—, ๊ทธ ํ•ฉ์ด ๊ฐ€์žฅ ํฐ ๊ฒƒ์„ ์ •๋‹ต์œผ๋กœ ๊ณจ๋ผ์•ผํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, dp์— ์–ด๋–ค๊ฒƒ๋“ค์„ ๋„ฃ์–ด์ฃผ์–ด์•ผํ• ๊นŒ?

๋‚ด๊ฐ€ ์ฒ˜์Œ์— ์ƒ๊ฐํ•œ ๋ฐฉ์‹์€ ์ด๊ฑฐ๋‹ค.

dp[i] =  arr[i]๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด์˜ ์ตœ๋Œ€ ํ•ฉ

(์˜ˆ์‹œ)
arr = [1, 100, 2, 50] ์ด๋ผ์น˜์ž.
dp[0] ์—๋Š” arr[0]์ด ๋งˆ์ง€๋ง‰ํ•ญ์ด ๋œ Lis์˜ ํ•ฉ์„ ๋„ฃ๋Š”๋‹ค. ์ฆ‰, dp[0] = 1 ์ด๋œ๋‹ค.
dp[1] ์€, 100์ด๊ณ  ์ด์ „ (i-1) ๊ฐ’๋ณด๋‹ค ํฌ๋ฏ€๋กœ, [1, 100]์€ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด์ด๋‹ค. ๊ทธ๋ž˜์„œ dp[1]์—๋Š” ๋‘๊ฐœ์˜ ํ•ฉ์ธ 101์„ ๋„ฃ๋Š”๋‹ค.
dp[2]๋Š” 2์ด๋‹ค. ์•ž๊ณผ ๊ฐ™์ด ์ด์ „(i-1)๊ฐ’๊ณผ ๋น„๊ตํ•ด๋ณด๋‹ˆ, 100์ด ๋” ํฌ๋ฏ€๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด์ด ๋  ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ, arr[i-2]๋ฒˆ์งธ์ธ 1๋ณด๋‹ค 2๊ฐ€ ํฌ๋ฏ€๋กœ, [1,2]๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿผ dp[2] ์—๋Š” 1๊ณผ 2๋ฅผ ๋”ํ•œ 3์„ ๋„ฃ์–ด์ค€๋‹ค.
... (๊ณ„์†) ๐Ÿ”

์ด๋ ‡๊ฒŒ dp์— ๊ฐ’์„ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์—ฌ๊ธฐ์„œ dp[2]๋ฅผ ๊ตฌํ•  ๋•Œ, arr์—์„œ 0๋ฒˆ์งธ ๋ถ€ํ„ฐ ์ˆœํšŒํ•˜๋ฉด์„œ ํ˜„์žฌ์˜ 2๋ณด๋‹ค ์ž‘์€์ง€ ๋ด์ฃผ๊ณ , ์ž‘๋‹ค๋ฉด 1๊นŒ์ง€์˜ ํ•ฉ (dp) + ํ˜„์žฌ์˜ 2๋ฅผ ๋”ํ•ด์ฃผ๋Š” ์‹์œผ๋กœ ๊ฐ€๋ฉด ๋œ๋‹ค.  ์ดํ•ด๊ฐ€ ํž˜๋“ค๋‹ค๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด์ž.

 

์œ„์—์„œ ๋ง๋กœ ์„ค๋ช…ํ•ด๋‘” ๊ฒƒ์„ ์ด๋ ‡๊ฒŒ ๊ทธ๋ฆฌ๋ฉด์„œ ์ƒ๊ฐํ–ˆ๋‹ค. ๋งˆ์ง€๋ง‰ i=2 ๊ฐ€ ๋˜์—ˆ์„๋•Œ, ์กฐ๊ฑด๊ณผ ์ด์ค‘ for๋ฌธ์„ ์ƒ๊ฐํ•ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

โšซ๏ธ ์ •๋‹ต ์ฝ”๋“œ

n = int(input())
arr = list(map(int, input().split()))
dp = [0] * n

dp[0] = arr[0]

for i in range(0, n):
    dp[i] = arr[i]
    for j in range(0, i):
        if arr[j] < arr[i] and dp[i] < dp[j] + arr[i]:
            dp[i] = max(dp[i], dp[j]+arr[i])

print(max(dp))
๋ฐ˜์‘ํ˜•