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

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 11053๋ฒˆ - ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด (DP๋กœ ํ‘ธ๋Š” LIS, ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด ๊ฐœ๋…)

๊ฐ์ž ๐Ÿฅ” 2022. 3. 13. 12:10
๋ฐ˜์‘ํ˜•

 

๋ฌธ์ œ ๋งํฌ

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

 

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

์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {10, 20, 10, 30, 20, 50} ์ธ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์€ A = {10, 20, 10, 30, 20, 50} ์ด

www.acmicpc.net

 

๋ฌธ์ œ ํ’€์ด IDEA

์ดˆ๋ฐ˜์— ๋„๋Œ€์ฒด ์ด๊ฒŒ ๋ฌด์Šจ ์†Œ๋ฆฌ์•ผ, ๊ทธ๋ƒฅ ์˜ค๋ฆ„์ฐจ์ˆœ์ด๋ฉด ์ˆ˜์—ด์ด ๋˜๋Š”๊ฑฐ์ž„? ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ์˜์•„ํ–ˆ์ง€๋งŒ, ๋ฐ”๋กœ ๊ทธ๊ฒŒ ์ž˜ ์ดํ•ดํ•œ ๊ฑฐ์˜€๋‹ค. ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด (LIS, Longest Increasing Subsequences) ๋ผ๋Š” ๊ฐœ๋…์ธ๋ฐ, ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์—์„œ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์—ด ์ค‘, ๊ฐ€์žฅ ๊ธด ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” ์ˆ˜์—ด(LIS)์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋ผ๋Š” ๋ฌธ์ œ์˜€๋‹ค. LIS ์— ๋Œ€ํ•œ ๊ฐœ๋…์€, ๋ฐ”๋กœ ์ง์ „์— ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๊ธ€์„ ๋ณด๊ณ  ์ดํ•ดํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

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

 

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

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

didu-story.tistory.com

 

์ด ๋ฌธ์ œ๋Š” LIS ๊ฐœ๋…์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š๋ƒ? ๋Š”๊ฒŒ ํ•ต์‹ฌ์ด๋‹ค. ๋‚˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค. (์‚ฌ์‹ค์ƒ LIS ๊ฐœ๋…๊ณผ ๋™์ผ)

  • ์ž…๋ ฅ๋ฐ›๋Š” ์ˆ˜์—ด์˜ ๊ธธ์ด n, ์ž…๋ ฅ๋ฐ›๋Š” ์ˆ˜์—ด inputArray,  i๋ฒˆ์งธ ๊นŒ์ง€์˜ ์ตœ์žฅ ์ˆ˜์—ด ๊ธธ์ด๋ฅผ ๋„ฃ๋Š” ๋ฐฐ์—ด dp
  • ํ˜„์žฌ ๋น„๊ตํ•˜๊ณ  ์‹ถ์€ ์ˆ˜์—ด์˜ ์œ„์น˜ i, ๋น„๊ตํ•  ์ด์ „์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ j (0๋ถ€ํ„ฐ i๊นŒ์ง€)
  • ํ˜„์žฌ inputArray[i] ๊ฐ€ ๋งŒ์•ฝ 3 ์ด๋ผ๋ฉด, inputArray[0], inputArray[1], inputArray[2] ์™€ ๋น„๊ตํ•ด์•ผํ•˜๊ณ , ๋น„๊ต ํ›„ inputArray[3]๊ฐ’์ด ๋” ํฌ๋‹ค๋ฉด dp์˜ ๊ฐ’์— +1 ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.์ด ๊ณผ์ •์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

์†Œ์Šค์ฝ”๋“œ

let n = Int(readLine()!)!
let inputArray = readLine()!.split(separator: " ").map { Int(String($0))! }
var dp: [Int] = []

for i in 0..<n {
    dp.append(1)
    for j in 0..<i+1 {
        if inputArray[j] < inputArray[i] {
            dp[i] = max(dp[i], dp[j]+1)
        }
    }
}

print(dp.max()!)

โ€ป ๋งˆ์ง€๋ง‰์— dp.max() ๊ฐ’์€ ์˜ต์…”๋„ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋‹ˆ๊นŒ ์ฃผ์˜ํ•˜์ž!

๋ฐ˜์‘ํ˜•