๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/14002
๋ฌธ์ ํ์ด IDEA
์ฐ์ ํด๋น ๋ฌธ์ ๋ LIS๋ฅผ ๊ตฌํํ ์ดํ์, LIS ๋ถ๋ถ ์์ด์ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ์๋ ๋ ๊ฐ์ ํฌ์คํ ์ ๋ชจ๋ ์ดํดํด์ผ ํด๋น ๋ฌธ์ ๋ฅผ ์์ํ๊ฒ ํ ์ ์๋ค.
โท LIS ๋?
https://didu-story.tistory.com/236
โท LIS ๊ตฌํ
https://didu-story.tistory.com/237
ํด๋น ๋ฌธ์ ๋ ์ ๋ฐฑ์ค 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: " ")
}