youngjaeLee1026 2022. 4. 12. 17:30

1. 문제

스크란샷 2022-04-12 17 25 30스크란샷 2022-04-12 17 24 44

2. μž…μΆœλ ₯

스크란샷 2022-04-12 17 24 53

3. μž…μΆœλ ₯ μ˜ˆμ‹œ

스크란샷 2022-04-12 17 25 00

4. 문제 섀계

  • λ‘œλ΄‡μ˜ μ‹œμž‘μ μ—μ„œ 였λ₯Έμͺ½κ³Ό μ•„λž˜μͺ½μœΌλ‘œλ§Œ 이동할 수 μžˆλŠ” 것을 λ°˜λŒ€λ‘œ μƒκ°ν•˜λ©΄, 쒅착점을 κΈ°μ€€μœΌλ‘œλŠ”
  • μ™Όμͺ½κ³Ό μœ„μͺ½μ—μ„œ 더 큰 μžμ›μ„ μˆ˜μ§‘ν•˜λ©΄μ„œ μ’…μ°©μ κΉŒμ§€ 도달할 κ²ƒμž„μ„ μ˜ˆμΈ‘ν•  수 있음
  • λ”°λΌμ„œ 큰 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μž‘μ€ λ¬Έμ œλΆ€ν„° μ°¨κ·Όμ°¨κ·Ό ν•΄κ²°ν•΄ λ‚˜κ°€λŠ” 동적 κ³„νšλ²•μœΌλ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 있음
  • λ”°λΌμ„œ, T[i][j] = λ‚˜λ₯Ό κΈ°μ€€μœΌλ‘œ μ™Όμͺ½κ³Ό 였λ₯Έμͺ½ 쀑 더 큰 값을 λ‚˜μ—κ²Œ λ”ν•œ 값이고,
  • T[i][j] + Max(T[i - 1][j], T[i][j - 1])둜 점화식을 μ„ΈμšΈ 수 있음
  • (0, 0)μ—μ„œλŠ” μœ„μ™€ μ™Όμͺ½μ΄ μ—†μœΌλ―€λ‘œ, (1, 1)λΆ€ν„° μ›μ†Œλ₯Ό μ±„μ›Œλ†“κ³  μœ„ 점화식을 μ μš©ν•˜μ—¬ μ΅œμ’…μ μœΌλ‘œ T[N][M]에 λˆ„μ λœ 값이
  • 정닡이며, O(N * M)의 μ‹œκ°„λ³΅μž‘λ„λ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 있음

5. 전체 μ½”λ“œ

//MARK: - μžμ› 채취

//MARK: - Framework
import Foundation

//MARK: - Function
func solution() -> Void {
    //MARK: - Input
    guard let input = readLine()?.components(separatedBy: " ") else { return }
    let N: Int = input.map { Int($0) }[0] ?? 0
    let M: Int = input.map { Int($0) }[1] ?? 0
    var table: [[Int]] = Array(repeating: Array(repeating: 0, count: M + 10), count: N + 10)
    
    for i in 1...N {
        guard let inputArray = readLine()?.components(separatedBy: " ") else { return }
        
        for j in 1...M {
            table[i][j] = inputArray.map { Int($0) ?? 0 }[j - 1]
        }
    }
    
    //MARK: - Process
    for i in 1...N {
        for j in 1...M {
            table[i][j] += table[i][j - 1] < table[i - 1][j] ? table[i - 1][j] : table[i][j - 1]
        }
    }
    
    //MARK: - Output
    print(table[N][M])
}
solution()

 

μ „μ²΄μ½”λ“œλŠ” μ—¬κΈ°μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.