๐Ÿฅˆ[DP] Silver

dynamic programming

1463 1๋กœ ๋งŒ๋“ค๊ธฐ

๋ฌธ์ œ๋กœ ์ด๋™

๋ฌธ์ œ ์š”์•ฝ

์ •์ˆ˜ x์— ๋Œ€ํ•ด ์„ธ ๊ฐ€์ง€ ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ x๋ฅผ 1๋กœ ๋งŒ๋“ค๊ณ ์ž ํ•  ๋•Œ, ์ตœ์†Œํ•œ์˜ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•ด๋ผ.

  • 3์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง„๋‹ค๋ฉด, 3์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.

  • 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง„๋‹ค๋ฉด, 2๋กœ ๋‚˜๋ˆˆ๋‹ค

  • 1์„ ๋บ€๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜

์ ํ™”์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.F(n)=min(F(n/3),F(n/2),F(1))+1F(n) = min(F(n/3), F(n/2), F(1)) + 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]
}

์‹œ๊ฐ„์ดˆ๊ณผ ๋ฐœ์ƒ ( filter, sorted ์‚ฌ์šฉ)
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 {
        var nexts = [Int](repeating: -1, count: 3)
        
        if i % 3 == 0 { nexts[0] = dp[i/3] }
        if i % 2 == 0 { nexts[1] = dp[i/2] }
        nexts[2] = dp[i-1]
        
        nexts = nexts.filter { $0 != -1 }
        
        dp.append(nexts.min()! + 1)
    }
    return dp[n]
}

2839 ์„คํƒ•๋ฐฐ๋‹ฌ

๋ฌธ์ œ๋กœ ์ด๋™

๋ฌธ์ œ ์š”์•ฝ

์ƒ๊ทผ์ด๋Š” ์ •ํ™•ํžˆ Nkg์˜ ์„คํƒ•์„ ๋ฐฐ๋‹ฌํ•ด์•ผํ•œ๋‹ค. ์„คํƒ•์€ 3kg, 5kg์˜ ๋ด‰์ง€์— ๋‹ด๊ฒจ์žˆ๋‹ค. ์ด๋•Œ ์ƒ๊ทผ์ด๊ฐ€ Nkg์˜ ์„คํƒ•์„ ์ตœ์†Œํ•œ์˜ ๋ด‰์ง€๋กœ ๋ฐฐ๋‹ฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋•Œ ์ตœ์†Œ ๋ด‰์ง€ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด๋ผ. (์ •ํ™•ํžˆ Nkg์œผ๋กœ ๋ฐฐ๋‹ฌํ•  ์ˆ˜ ์—†์„ ๋•Œ์—๋Š” -1๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.)

์•Œ๊ณ ๋ฆฌ์ฆ˜

  1. ์„คํƒ• DP ๋ฐฐ์—ด์„ ์„ ์–ธํ•œ๋‹ค.

  2. ์ ํ™”์‹ F(n)=min(F(nโˆ’3),F(nโˆ’5))+1F(n) = min(F(n-3), F(n-5)) +1์„ ๋งŒ์กฑํ•˜๋Š” 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(n)=min(F(nโˆ’3),F(nโˆ’5))+1F(n) = min(F(n-3), F(n-5)) +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]
}
๊ทธ๋ฆฌ๋”” ์ ‘๊ทผ ๋ฐฉ์‹ (ํ‹€๋ฆฐ ๋ฐฉ๋ฒ•)
var sugar = Int(readLine()!)!
var result = 0

for x in [3, 5] {
    if sugar >= x {
        result += sugar / x
        sugar %= x
    }
}
print( sugar == 0 ? result : -1)

9095 1, 2, 3 ๋”ํ•˜๊ธฐ

๋ฌธ์ œ๋กœ ์ด๋™

๋ฌธ์ œ ์š”์•ฝ

์ •์ˆ˜ n์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, 1, 2, 3์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด๋ผ.

n = 3์ด๋ผ๋ฉด (1+1+1, 1+2, 2+1, 3) 4๊ฐ€์ง€๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ ‘๊ทผ๋ฐฉ๋ฒ•

  • ์‚ฌ์‹ค ๊ทœ์น™์„ ์ƒ๊ฐํ•˜๊ธฐ ์ „์— ์ ํ™”์‹์ด ๋– ์˜ฌ๋ž๋‹ค. (์–ป์–ด ๊ฑธ๋ ธ๋‹ค๋Š” ๋ง)

  • ์ ํ™”์‹ F(n)=F(nโˆ’1)+F(nโˆ’2)+F(nโˆ’3)F(n) = F(n-1) + F(n-2) + F(n-3)

    • ์ด๊ฒŒ ์™œ ๋งž์ง€? ๋ผ๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋Š”๋ฐ 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๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ผ.

์•Œ๊ณ ๋ฆฌ์ฆ˜

  1. ์ˆ˜์—ด์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

  2. ๋‚˜๋ณด๋‹ค ์ž‘์€ ์ˆ˜ ์ค‘ ๋ถ€๋ถ„ ์ˆ˜์—ด์ด ๊ฐ€์žฅ ๊ธด ๊ฐ’์„ ์ฐพ์•„ ์ €์žฅํ•œ๋‹ค.

  3. 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