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

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 14002๋ฒˆ - ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด4 (dp, LIS value ์ถœ๋ ฅํ•˜๊ธฐ)

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

๋ฌธ์ œ ๋งํฌ

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

 

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

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

www.acmicpc.net

 

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

์šฐ์„  ํ•ด๋‹น ๋ฌธ์ œ๋Š” LIS๋ฅผ ๊ตฌํ˜„ํ•œ ์ดํ›„์—, LIS ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ด๊ธฐ ๋–„๋ฌธ์— ์•„๋ž˜ ๋‘ ๊ฐœ์˜ ํฌ์ŠคํŒ…์„ ๋ชจ๋‘ ์ดํ•ดํ•ด์•ผ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์ˆ˜์›”ํ•˜๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

โ–ท LIS ๋ž€?

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

 

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

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

didu-story.tistory.com

โ–ท LIS ๊ตฌํ˜„

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

 

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

๋ฌธ์ œ ๋งํฌ https://www.acmicpc.net/problem/11053 11053๋ฒˆ: ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด ์ˆ˜์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆ˜์—ด A = {10, 20, 1..

didu-story.tistory.com

 

ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์œ„ ๋ฐฑ์ค€ 11053๋ฌธ์ œ์˜ ์—ฐ์žฅ์œผ๋กœ, LIS ์ˆ˜์—ด์„ ์ง์ ‘ ์ถœ๋ ฅํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋ƒฅ ๋งจ ์ฒ˜์Œ ๋ถ€ํ„ฐ ๋น„๊ตํ•ด์„œ ์•ž์ˆ˜๋ณด๋‹ค ํฌ๋ฉด ์ถœ๋ ฅํ•˜๋ฉด ๋ผ! ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ์—๋Š”, ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. (๋‚˜์˜ ์ดˆ๋ฐ˜ ์ƒ๊ฐ ใ…‹ใ…‹)

[30, 20 , 40, 50 , 60]

์œ„์™€ ๊ฐ™์€ ์ˆ˜์—ด์ด ์žˆ์„ ๊ฒฝ์šฐ, LIS๋ฅผ ๊ตฌํ•  ๋•Œ ๋งจ ์ฒ˜์Œ์˜ 30์€ ์ œ๊ฑฐ๋˜๋Š” ์ˆซ์ž์ด๋‹ค. 30์€ ์ œ๊ฑฐ๋˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ๋ถ€๋ถ„์ˆ˜์—ด์ด ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์ด ๋  ๊ฒƒ์ด๋‹ค. 

[20, 40, 50, 60]

 

๋”ฐ๋ผ์„œ ๋งจ ์•ž์—์„œ๋ถ€ํ„ฐ ๊ทธ๋ƒฅ ์ด์ „ ์ˆ˜์™€ ๋น„๊ตํ•ด์„œ ์ถœ๋ ฅํ•˜๋ฉด ๋ผ~ ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ์—๋Š” ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•์€ ๊ฐ€์žฅ ํฐ LIS ๊ธธ์ด ๊ฐ’์„ ๊ฐ–๋Š” ๋ถ€๋ถ„ ๋ถ€ํ„ฐ, ํ•œ์นธ ์”ฉ ์•ž์œผ๋กœ ๊ฐ€๋ฉด์„œ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

  • ๊ฐ€์žฅ ํฐ dp ๊ฐ’์„ ๊ฐ–๋Š” value๋ฅผ ๋จผ์ € ์ถœ๋ ฅํ•˜๊ณ , ๊ทธ๋‹ค์Œ ํฐ dp๋ฅผ ์ฐพ์•„๋‚˜์„œ๋Š” ๊ณผ์ •์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„
  • ๋‹จ, ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๊ฐ–๋Š” dp์˜ ์œ„์น˜๋ณด๋‹ค ‘์•ž'์˜ value ๋“ค๋งŒ ์‚ดํŽด๋ณด๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ! ๊ทธ๋ž˜์„œ maxDP๋ฅผ ๊ตฌํ•˜๊ณ , -1 ํ•ด๋‚˜๊ฐ€๋ฉด์„œ ์•ž์—์žˆ๋Š” ๊ฐ’๋“ค์ด ๋” ์ž‘์€์ง€ ํฐ์ง€ ํŒ๋ณ„ํ•˜๋Š” ๊ณผ์ •์„ ์ง„ํ–‰
  • ๋งˆ์ง€๋ง‰์— ์ถœ๋ ฅํ• ๋•Œ reverse ํ•ด์„œ ์ถœ๋ ฅํ•ด์ค˜์•ผํ•จ. (ํฐ ๊ฐ’ ๋ถ€ํ„ฐ ๋ฝ‘์•˜๊ธฐ ๋•Œ๋ฌธ)

๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

์˜ˆ์ œ์—์„œ๋Š” [10, 20, 10, 30, 20, 50] ์ด๋ผ๋Š” ์ˆ˜์—ด์ด ์ฃผ์–ด์กŒ๋‹ค. LIS๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์€ ๋ชจ๋‘ dp ๋ฐฐ์—ด์— ์ €์žฅํ–ˆ๊ณ , dp ๋ฐฐ์—ด [1, 2, 1, 3, 2, 4]  ๊ฐ€ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ํฐ LIS ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ dp[5] ์ด๋‹ค. ๊ทธ๋Ÿผ ํ•ด๋‹น ์ธ๋ฑ์Šค 5 ๋ฅผ maxIdx๋กœ ์ €์žฅํ•ด๋‘๊ณ , ํ•ด๋‹น ์ธ๋ฑ์Šค ๋ณด๋‹ค "์•ž"๋ถ€๋ถ„์œผ๋กœ ์ „์ง„ํ•˜๋ฉด์„œ ์ฐจ๋ก€๋Œ€๋กœ ๊ฐ’์„ ๋น„๊ตํ•˜๋ฉด ๋œ๋‹ค. (4, 3, 2, 1, ์ด๋ ‡๊ฒŒ ์ฐจ๋ก€๋Œ€๋กœ ๋น„๊ตํ•ด์•ผํ•œ๋‹ค. 4๋ณด๋‹ค ์ž‘๋‹ค๊ณ  ๋ฌด์กฐ๊ฑด ์ถœ๋ ฅํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, 4๋‹ค์Œ ์ˆซ์ž์ธ 3์„ ์ฐพ๊ณ , 3๋‹ค์Œ์ˆซ์ž์ธ 2๋ฅผ ์ฐพ๊ณ  ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— for ๋ฌธ์—์„œ i ๊ฐ’์„ -1 ํ•ด์ฃผ๋ฉด์„œ ๊ฐ’์„ ์ฐพ์„ ๊ฒƒ์ด๋‹ค.)

 

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

ํฐ ์ˆ˜ ๋ถ€ํ„ฐ answer์— ๋„ฃ์–ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋งˆ์ง€๋ง‰์— ์ถœ๋ ฅํ•  ๋•Œ๋„ ๊ฑฐ๊พธ๋กœ ์ถœ๋ ฅํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์žŠ์ง€ ๋ง์ž.

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[i] > inputArray[j] {
            dp[i] = max(dp[i], dp[j]+1)
        }
    }
}
print(dp.max()!)

var maxDp = dp.max()!
var maxIdx = dp.firstIndex(of:maxDp)!
var answer: [Int] = []

while maxIdx >= 0 {
    if dp[maxIdx] == maxDp {
        answer.append(inputArray[maxIdx])
        maxDp -= 1
    }
    maxIdx -= 1
}

for i in stride(from: answer.count-1, through: 0, by: -1) {
    print(answer[i], terminator: " ")
}

 

๋ฐ˜์‘ํ˜•