๐ฅ[DP] Silver
dynamic programming
1463 1๋ก ๋ง๋ค๊ธฐ
๋ฌธ์ ์์ฝ
์ ์ x์ ๋ํด ์ธ ๊ฐ์ง ์ฐ์ฐ์ ํ ์ ์๋ค. ์ฐ์ฐ์ ๋ฐ๋ณตํ๋ฉฐ x๋ฅผ 1๋ก ๋ง๋ค๊ณ ์ ํ ๋, ์ต์ํ์ ์ฐ์ฐ ํ์๋ฅผ ๊ตฌํด๋ผ.
3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ค๋ฉด, 3์ผ๋ก ๋๋๋ค.
2๋ก ๋๋์ด ๋จ์ด์ง๋ค๋ฉด, 2๋ก ๋๋๋ค
1์ ๋บ๋ค.
์๊ณ ๋ฆฌ์ฆ
์ ํ์์ ๋ค์๊ณผ ๊ฐ๋ค.
ํด๋น ์ ํ์์ ์ฌ์ฉํ์ฌ Bottom up ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌํํ๋ค.
์ ๊ทผ ๋ฐฉ๋ฒ
๊ทธ๋ฆฌ๋๋ ์ ์ ๋ ๊น?
๋ฌด์กฐ๊ฑด ๋๋์ ์ด ์ซ์๊ฐ ๋ ๋นจ๋ฆฌ ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฆฌ๋๋ฅผ ์๊ฐํ ์ ์์ง๋ง, ์ต์ ํ๊ฐ ์๋๋ค.
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ 3์ผ๋ก ๋๋ -> 2๋ก ๋๋ -> 1๋ก ๋บ์ ์์๋ก ์ด๋ฃจ์ด ์ง ๊ฒ์ด๋ค.
2n + 1์ ์๊ฐํด๋ณด์.
Greedy: 11 -> 10 -> 5 -> 4 -> 2 -> 1 (6ํ)
์ต์ ํด : 11 -> 10 -> 9 -> 3 -> 1 (5ํ)
๊ฐ๋จํ ์์ ๋ก๋ ๊ทธ๋ฆฌ๋๊ฐ ์ต์ ํด๊ฐ ์๋์ ๋ฐํ ์ ์๋ค.
์ฝ๋
var dp = [0, 0, 1, 1]
print(makeNumberOne(Int(readLine()!)!))
func makeNumberOne(_ n: Int) -> Int {
guard n > 3 else { return dp[n] }
for i in 4 ... n {
dp.append(dp[i-1] + 1)
if i % 3 == 0 { // 3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ค๋ฉด
dp[i] = min(dp[i], dp[i/3] + 1)
}
if i % 2 == 0 { // 2๋ก ๋๋์ด ๋จ์ด์ง๋ค๋ฉด
dp[i] = min(dp[i], dp[i/2] + 1)
}
}
return dp[n]
}
2839 ์คํ๋ฐฐ๋ฌ
๋ฌธ์ ์์ฝ
์๊ทผ์ด๋ ์ ํํ Nkg์ ์คํ์ ๋ฐฐ๋ฌํด์ผํ๋ค. ์คํ์ 3kg, 5kg์ ๋ด์ง์ ๋ด๊ฒจ์๋ค. ์ด๋ ์๊ทผ์ด๊ฐ Nkg์ ์คํ์ ์ต์ํ์ ๋ด์ง๋ก ๋ฐฐ๋ฌํ๋ ค๊ณ ํ๋ค. ์ด๋ ์ต์ ๋ด์ง ์๋ฅผ ๊ณ์ฐํด๋ผ. (์ ํํ Nkg์ผ๋ก ๋ฐฐ๋ฌํ ์ ์์ ๋์๋ -1๋ฅผ ์ถ๋ ฅํ๋ค.)
์๊ณ ๋ฆฌ์ฆ
์คํ DP ๋ฐฐ์ด์ ์ ์ธํ๋ค.
์ ํ์ ์ ๋ง์กฑํ๋ F(n)์ ๊ณ์ฐํ์ฌ ์ถ๋ ฅํ๋ค.
์ ๊ทผ๋ฐฉ๋ฒ
๊ทธ๋ฆฌ๋๋ก ์ ๋๋ ์ด์ ?
์ฒ์์๋ ๊ทธ๋ฆฌ๋๋ก ์ถฉ๋ถํ ์ ๊ทผ ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ๋ค.
๊ฑฐ์ค๋ฆ๋ ๋ฌธ์ ์ฒ๋ผ, 5ํค๋ก ๊ทธ๋จ ๋ด์ง๋ก ๋๋๊ณ , ๋๋จธ์ง๋ฅผ 3ํค๋ก ๋ด์ง์ ๋ด์ผ๋ฉด ๋์ง ์๋? ๋ผ๊ณ ์๊ฐํ์ง๋ง ์๋๋ค!
๊ทธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ฅด๋ฉด, ๊ฐ๋ฅํ ๋งํผ 5kg๋ก ๊ฐ์ ธ๊ฐ๊ณ , ๋๋จธ์ง๋ฅผ 3kg์ ๋ด์์ผํ๋ค.
ํ์ง๋ง 5๋ 3์ ๋ฐฐ์๊ฐ ์๋๋ค. ์ด์ 5๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ฐฐ๋ฌํ ์ ์์ง๋ง, ๊ทธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ๋ฒ์ผ๋ก ์ธํด -1์ด ์ถ๋ ฅ๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค.
์์ 1) ์คํ 21kg
Greedy : 5kg 4๊ฐ, ๋จ์ ์คํ 1kg -> ๋ฐฐ๋ฌ ๋ถ๊ฐ, -1 ์ถ๋ ฅ
์ค์ ์ ๋ต : 3kg 7๊ฐ -> ๋ฐฐ๋ฌ ๊ฐ๋ฅ, 7 ์ถ๋ ฅ
์์ 2) ์คํ 11kg
Greedy: 5kg 1๊ฐ, ๋จ์ ์คํ 1kg -> ๋ฐฐ๋ฌ ๋ถ๊ฐ, -1 ์ถ๋ ฅ
์ค์ ์ ๋ต: 5kg 1๊ฐ, 3kg 2๊ฐ -> ๋ฐฐ๋ฌ ๊ฐ๋ฅ, 3 ์ถ๋ ฅ
๋ฐ๋ผ์ ์ด ๋ฌธ์ ๋ ๊ทธ๋ฆฌ๋๋ก ํ ์ ์๋ค.
์ ํ์ ์ธ์ฐ๋ ๋ฐฉ๋ฒ
์คํ 11kg์ผ๋ก ์๊ฐํ๋ฉด ์ด๋ ๊ฒ ์๊ฐํ ์ ์๋ค.
์คํ 6kg + 5kg = 11kg
์คํ 8kg + 3kg = 11kg
์คํ 8kg์ ๋ง๋ค ์ ์๋์ง ์ฐ์ ๊ณ ๋ คํ์ง ์๊ณ , 11kg๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์๊ฐํ๋ฉด ๋๋ค. (3kg๋ก ๋ง๋ค์ง 5kg์ผ๋ก ๋ง๋ค์ง)
๊ทธ๋ฆฌ๊ณ ์คํ 6kg์ผ๋ก ๋ง๋๋๊ฒ ๋ ๋น ๋ฅธ์ง, 8kg์ ๋ง๋๋๊ฒ ๋ ๋น ๋ฅธ์ง ๋น๊ตํ๋ ๊ฒ์ด๋ค. ์ดํ ์คํ ๋ด์ง 5kg ๋๋ 3kg์ ๋ํ๋ฉด ๋๋ค. (+1์ด ๋ค์ด๊ฐ๋ ์ด์ )
๊ทธ๋์ ์ด ์ ํ์์ด ๋์ค๋ ๊ฒ์ด๋ค.
F(11) = ์ต์(์คํ 8kg ๊ฒฝ์ฐ์ ์, ์คํ 6kg ๊ฒฝ์ฐ์ ์) + 1
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ F(x)๊ฐ -1์ธ ๊ฒฝ์ฐ๋ ์ ํจํ์ง ์์ ๊ฐ์์ ์ธ์งํ๊ณ ์์ด์ผํ๋ค.
์ฝ๋
// ์คํ ๋ฐฐ์ด ์ค์
var sugarDP = [-1, -1, -1, 1, -1, 1]
var sugar = Int(readLine()!)!
print(getSugar(sugar))
func getSugar(_ n: Int) -> Int {
// n์ด 5์ผ ๋ ๊น์ง๋ ์ ์ธ๋ ์คํ ๋ฐฐ์ด์ ์ถ๋ ฅํ๋ค.
guard n > 5 else { return sugarDP[n] }
// Bottom UP ๋ฐฉ์์ DP
for i in 6...n {
let prev1 = sugarDP[i-3]
let prev2 = sugarDP[i-5]
// -1์ ์ ํจํ์ง ์์ ๊ฐ์ด๋ฏ๋ก ์ ๊ฑฐ ํ ์ ๋ ฌํ๋ค.
let temp = [prev1, prev2].filter { $0 != -1 }.sorted()
// prev1๊ณผ prev2๊ฐ ๋ชจ๋ -1์ด์๋ค๋ฉด, -1์ ์ถ๊ฐํ๋ค.
guard !temp.isEmpty else {
sugarDP.append(-1)
continue
}
// prev1, prev2 ์ค ์์ ๊ฐ์ 1์ ๋ํด i๋ฅผ ๊ณ์ฐํ๋ค.
sugarDP.append(temp[0] + 1)
}
return sugarDP[n]
}
9095 1, 2, 3 ๋ํ๊ธฐ
๋ฌธ์ ์์ฝ
์ ์ n์ด ์ฃผ์ด์ก์ ๋, 1, 2, 3์ ํฉ์ผ๋ก ๋ํ๋ผ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํด๋ผ.
n = 3์ด๋ผ๋ฉด (1+1+1, 1+2, 2+1, 3) 4๊ฐ์ง๋ก ํํํ ์ ์๋ค.
์ ๊ทผ๋ฐฉ๋ฒ
์ฌ์ค ๊ท์น์ ์๊ฐํ๊ธฐ ์ ์ ์ ํ์์ด ๋ ์ฌ๋๋ค. (์ป์ด ๊ฑธ๋ ธ๋ค๋ ๋ง)
์ ํ์
์ด๊ฒ ์ ๋ง์ง? ๋ผ๋ ์๊ฐ์ ํ๋๋ฐ F(1)์ 1์ด ์๋ฏธํ๋ ๋ฐ๊ฐ ์ต๋๊ฐ์ด 1์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
F(4) = F(3) + F(2) + F(1) ์ด๋ค.
F(1)์์ 3์ ๋ํ๋ฉด 4, F(2)์์ 2๋ฅผ ๋ํ๋ฉด 4, F(3)์์ 1์ ๋ํ๋ฉด 4๊ฐ ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก F(7) = F(6) + F(5) + F(4)
F(6)์์ 1์ ๋ํ๋ฉด 7, F(5)์์ 2๋ฅผ ๋ํ๋ฉด, F(4)์์ 3์ ๋ํ๋ฉด 7์ด ๋๋ค.
๊ฒฝ์ฐ์ ์์ ์ฐ์ฐ์ ํท๊ฐ๋ฆฌ์ง ๋ง์!!
์ฝ๋
var dp = [0, 1, 2, 4]
// ์ ํ์์ ์ฝ๋๋ก ํํํ๋ค.
for i in 4...11 {
dp.append(dp[i-1] + dp[i-2] + dp[i-3])
}
// ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
let testCase = Int(readLine()!)!
for _ in 0 ..< testCase {
print(dp[Int(readLine()!)!])
}
11053 ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด
๋ฌธ์ ์์ฝ
์์ด A๊ฐ ์ฃผ์ด์ก์ ๋, ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ผ.
์๊ณ ๋ฆฌ์ฆ
์์ด์ ์ ๋ ฅ๋ฐ๋๋ค.
๋๋ณด๋ค ์์ ์ ์ค ๋ถ๋ถ ์์ด์ด ๊ฐ์ฅ ๊ธด ๊ฐ์ ์ฐพ์ ์ ์ฅํ๋ค.
result์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
์ ๊ทผ ๋ฐฉ๋ฒ
์ฐ์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด์ด๋ผ๋ ๋ง ๋ถํฐ ์ดํด๋ฅผ ํด ๋ณด์.
๋ถ๋ถ ์์ด = "์ฃผ์ด์ง ์์ด์ ์ผ๋ถ ํญ์ ์๋ ์์๋๋ก ๋์ดํ์ฌ ์ป์ ์ ์๋ ์์ด"
์ฆ๊ฐํ๋ ์์ด = "์ค๋ฆ์ฐจ์์ผ๋ก ์ฆ๊ฐํ๋ ์์ด"
๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด = ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋๋ ๋ถ๋ถ์์ด ์ค length๊ฐ ๊ฐ์ฅ ๊ธด ์์ด
-> [10, 20, 10, 30, 20, 50]์์ ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด = [10, 20, 30, 50]์ด ๋๋ ๊ฒ์ด๋ค.
๋ฌธ์ ๋ฅผ ์ดํดํ์ผ๋, ๋ฌธ์ ๋ฅผ ํธ๋ ๋ฐฉ๋ฒ์ ๊ณฐ๊ณฐํ ์๊ฐํด๋ณด์!
์ฐ์ , ์์ x์ ๋ํด ์ต์ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ ๋ญ๊น? -> 1์ด๋ค! (x๋ก๋ง ์ด๋ฃจ์ด์ง ๋ถ๋ถ ์์ด์ด ์๊ธฐ ๋๋ฌธ)
๊ทธ๋ผ x๋ฅผ ํฌํจํ๋ ๋ถ๋ถ ์์ด์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ญ๊น?
์๊ธฐ ์์ ๋ณด๋ค ์์ ์ ์ค result[n]์ด ๊ฐ์ฅ ํฐ ๊ฒ + 1 ์ด ๋๋ค.
์ฆ, max( result[1...x-1] + 1, ๋จ x๋ณด๋ค ์์ ๊ฒฝ์ฐ)
๋๋ฌด ์ถ์์ ์ด๋ [10, 20, 10, 30, 20, 50]์ผ๋ก ๋ค์ ์๊ฐํด๋ณด์.
result ๋ฐฐ์ด์๋ [1, 1, 1, 1, 1, 1] ์ด ์ ์ฅ ๋ผ ์๋ค.
(10์ ๋น๊ตํ ๊ฒ ์์ผ๋ ๋์ด๊ฐ๋ค.) 20์ 10๋ณด๋ค ํฌ๋ค. ๋ฐ๋ผ์ 10์ result์์ 1์ ๋ํ ๊ฐ์ ๊ฐ๋๋ค.
๋ค์ 3๋ฒ์งธ ์์ 10์ ๋ณด๋, 10๋ณด๋ค ์์ ๊ฐ์ด ์ ํ ์์ผ๋ฏ๋ก ๊ทธ๋๋ก result ๋ 1์ด๋ค.
๋ค์ 4๋ฒ์งธ ์์ 30์ ๋ณด์. [10, 20, 10]์ ๋ชจ๋ 30๋ณด๋ค ์๋ค. ์ด ์ค result๊ฐ ๊ฐ์ฅ ํฐ ๊ฒ์ 20์ด๋ค. ๋ฐ๋ผ์ 30์ ๋ํ result ๊ฐ์ 2 + 1 = 3์ด ๋๋ค. (2: 20์ ํฌํจํ์ ๋ ๋ถ๋ถ ์์ด, 1์ 30์ด ํฌํจ๋๋ ์ซ์)
๋ค์ 20์ ๋ณด์. ์๊ธฐ๋ณด๋ค ์์ [10, 10] ์ ๋ํด ๋ถ๋ถ์์ด์ ๋ง๋ค ์ ์๊ณ , 1+1 = 2๊ฐ ๋๋ค.
๋ง์ง๋ง 50์ ๋ณด์. ์๊ธฐ๋ณด๋ค ์์ ๋ชจ๋ ๊ฐ์ ๋ํด ์กฐํํ๊ณ , ๊ฐ์ฅ ํฐ 3 + 1 = 4๊ฐ ๋๋ค.
let n = Int(readLine()!)!
let numbers = readLine()!.split { $0 == " " }.map { Int($0)! }
var result = [Int](repeating: 1, count: n)
for i in 0 ..< n {
var count = 1
for j in stride(from: i, to: -1, by: -1) {
if numbers[i] > numbers[j] {
count = max(count, result[j] + 1)
}
}
result[i] = count
}
print(result.max()!)
Last updated