Notice
Recent Posts
Recent Comments
Link
Β«   2024/06   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Archives
Today
Total
관리 메뉴

lgvv98

[Swift] BOJ 2158 포도주 μ‹œμ‹ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ

[Swift] BOJ 2158 포도주 μ‹œμ‹

πŸ₯• 캐럿맨 2022. 4. 2. 03:42

BOJ 2158 ν¬λ„μ£Ό μ‹œμ‹

 

βœ… λΉ„μŠ·ν•œ μœ ν˜•μ„ 일전에 ν’€μ–΄λ³Έ 기얡이 μžˆμ–΄μ„œ 금방 ν’€κ² λ‹€ ν–ˆμ—ˆλŠ”λ°, 무지 였래 걸렸음.

λ°±μ€€ 2579번 κ³„λ‹¨μ˜€λ₯΄κΈ°μ™€ λΉ„μŠ·ν•œλ°, μ•½κ°„ λ‹€λ₯Έ 점이 있음

계단 였λ₯΄κΈ°μ—μ„œλŠ” λ§ˆμ§€λ§‰κ°’μ„ 무쑰건 μ„ νƒν•˜μ§€λ§Œ ν¬λ„μ£ΌλŠ” λ§ˆμ§€λ§‰μ„ μ„ νƒν•˜μ§€ μ•Šμ„ μˆ˜λ„ 있음.

무슨 말이냐면

[100 100 1 1 100 100]의 κ²°κ³Όκ°€ μžˆλ‹€κ³  ν•˜μž.

계단 였λ₯΄κΈ° μ•Œκ³ λ¦¬μ¦˜μ„ μ μš©ν•˜λ©΄ 301이 λ‚˜μ˜€λ‚˜, 포도주 μ‹œμ‹ λ¬Έμ œμ—μ„œλŠ” 400이 λ‚˜μ™€μ•Ό 함.

 

βœ… μ•Œκ³ λ¦¬μ¦˜ μ ‘κ·Όλ²•μš°μ„  계단 였λ₯΄κΈ°μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ ? X O? X O O둜 λ‚˜λˆ„μ–΄μ„œ μƒκ°ν–ˆμŒ.? μžλ¦¬λŠ” dpλ°°μ—΄μ—μ„œ Oμžλ¦¬λŠ” λ¦¬μŠ€νŠΈμ—μ„œ λ½‘κΈ°λ”°λΌμ„œ μš°λ¦¬λŠ” 점화식을 λ§Œλ“€ 수 μžˆλŠ”λ°, 끝자리λ₯Ό i라고 κ°€μ •ν–ˆμ„ μ‹œ

1. dp[i-2] + list[i]
2. dp[i-3] + list[i] + list[i-1]

μ΄λ ‡κ²Œ λ‘κ°œμ˜ 점화식을 λ§Œλ“€ 수 있음.

 

근데 μš°λ¦¬λŠ” λ§ˆμ§€λ§‰μ„ κ²½μš°μ— λ”°λΌμ„œ μ„ νƒν•˜μ§€ μ•Šμ„ μˆ˜λ„ 있음.κ·Έλ‹ˆκΉŒ 3연속이 λΆˆκ°€ν•˜λ―€λ‘œ ? X O O X의 κ²½μš°κ°€ μƒκΈ°λŠ” κ²ƒμž„.dp λ°°μ—΄μ˜ 값은 κ·Έ μΈλ±μŠ€κΉŒμ§€λŠ” 항상 κ·Έ 값이 μ΅œμ„ μ˜ 값을 μ„ νƒν–ˆλ‹€κ³  κ°€μ •ν•˜κ³  있음.λ§Œμ•½ dp[i]의 값이 dp[i-1]κ³Ό κ°™λ‹€λ©΄ μ–΄λ–€μ˜λ―ΈμΌκΉŒ?λ°”λ‘œ dp[i]의 값이 μ„ νƒλ˜μ§€ μ•Šμ€ μΌ€μ΄μŠ€μž„. (list[i] > 0) κ·Έ μΌ€μ΄μŠ€μ˜ κ²½μš°μ—λŠ” λ§ˆμ§€λ§‰μ„ μ„ νƒν•˜μ§€ μ•ŠμŒ.

 

λ‹€μ‹œ λ§ν•΄μ„œ μ΄λ²ˆμ— μ„ νƒν•˜μ§€ μ•Šμ•˜μœΌλ©΄ 이전(i-1)κΉŒμ§€μ˜ μ΅œμ„ κ°’μ΄ ν˜„μž¬(i)와 같은 값이 λœλ‹€.

즉 max(dp[i], dp[i-1])을 ν†΅ν•΄μ„œ μ΄λ²ˆμ— 선택할지 말지에 λŒ€ν•œ 결정을 ν•  수 μžˆλ‹€.

λ”°λΌμ„œ λ§ˆμ§€λ§‰μ— dp[i] 의 κ°’κ³Ό dp[i-1]값을 λΉ„κ΅ν•΄μ„œ 더 큰 값을 dp[i]에 λ„£μ–΄μ€€λ‹€. 

 

🟠 μ½”λ“œ

// https://www.acmicpc.net/problem/2156
import Foundation

struct b2156 {
    
    static func run() {
        // DPλ₯Ό μ΄μš©ν•˜μ—¬ ν’€μ–΄μ•Ό ν•©λ‹ˆλ‹€.
        let input: Int = Int(readLine()!)!
        var list = [Int]()
        var dp = [Int](repeating: 0, count: input)
        for _ in 0..<input {
            list.append(Int(readLine()!)!)
        }

        if input >= 1 {
            dp[0] = list[0]
        }
        if input >= 2 {
            dp[1] = list[0] + list[1]
        }
        if input >= 3 {
            dp[2] = max(list[0] + list[2], list[1] + list[2])
            dp[2] = max(dp[2], dp[1])
            for i in 3..<list.count {
                dp[i] += max(dp[i-2] + list[i] , dp[i-3] + list[i] + list[i-1])
                dp[i] = max(dp[i], dp[i-1])
            }
            
        }
//        print(dp)
        print(dp.max()!)
    }
}
Comments