Swift Data Structure And Algorithm/Dynamic Programming

두 λ¬Έμžμ—΄ μ‚¬μ΄μ˜ 거리

youngjaeLee1026 2022. 4. 12. 17:46

1. 문제

스크란샷 2022-04-12 17 38 44

2. μž…μΆœλ ₯

스크란샷 2022-04-12 17 38 51

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

스크란샷 2022-04-12 17 38 57

4. 문제 섀계

  • μœ„ 문제의 경우 유λͺ…ν•œ νŽΈμ§‘κ±°λ¦¬ μ•Œκ³ λ¦¬μ¦˜κ³Ό μœ μ‚¬ν•œλ°, λ‹€λ₯Έ 점은 μ‚½μž…, μ‚­μ œ, ꡐ체 연산쀑 μ‚½μž…, μ‚­μ œ 두 κ°€μ§€ μ—°μ‚°λ§Œ μ‘΄μž¬ν•œλ‹€λŠ” 점
  • λ”°λΌμ„œ A λ¬Έμžμ—΄μ˜ μ•ŒνŒŒλ²³λ“€μ„ ν–‰μœΌλ‘œ, B λ¬Έμžμ—΄μ˜ μ•ŒνŒŒλ²³λ“€μ„ μ—΄λ‘œ λ°°μΉ˜ν–ˆμ„ λ•Œ, λ°œμƒν•  수 μžˆλŠ” 연산에 λŒ€ν•΄ μ €μž₯ν•΄ λ‚˜κ°€λŠ” 동적 κ³„νšλ²• μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•  수 있음
  • λ¨Όμ €, A[i] == B[j] 라면, 더 이상 μˆ˜ν–‰ν•΄μ•Όν•  연산이 μ—†μœΌλ―€λ‘œ, μ™Όμͺ½ λŒ€κ°μ„  μœ„μ—μ„œ 값을 κ·ΈλŒ€λ‘œ λ³΅μ‚¬ν•˜λ©΄ 되고,
  • A[i]와 B[j]κ°€ κ°™μ§€ μ•Šλ‹€λ©΄, table[i][j]의 μœ„μ˜ κ°’ + 1인 μ‚­μ œ μ—°μ‚°ν•œ κ°’κ³Ό, μ™Όμͺ½ κ°’ + 1인 μ‚½μž… μ—°μ‚°ν•œ κ°’ 쀑 μž‘μ€ 값을 ν˜„μž¬ table[i][j]에 μ €μž₯ν•˜λ©΄ 됨
  • λ”°λΌμ„œ, table[i][j] = A[0 ~ i]μ—μ„œ B[0 ~ j]λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μ‚½μž…/ν˜Ήμ€ μ‚­μ œ 연산에 λŒ€ν•œ μ΅œμ†Œκ°’μ΄λ©°,
  • table[i][j] = A[i] == B[j], table[i - 1][j - 1]이고, μ•„λ‹ˆλΌλ©΄, min(table[i - 1][j], table[i][j - 1]) + 1의 점화식을 ꡬ할 수 있고,
  • 문제의 크기 1000을 n이라고 ν–ˆμ„ λ•Œ, O(n^2)의 μ‹œκ°„λ³΅μž‘λ„λ‘œ 문제λ₯Ό ν•΄κ²°ν•  수 있음

5. 전체 μ½”λ“œ

//MARK: - 두 λ¬Έμžμ—΄ μ‚¬μ΄μ˜ 거리

//MARK: - Framework
import Foundation

//MARK: - Variable
var table: [[Int]] = []

//MARK: - Function
func solution() -> Void {
    //MARK: - Input
    guard let A: String = readLine() else { return }
    guard let B: String = readLine() else { return }
    
    table = Array(repeating: Array(repeating: 0, count: B.count), count: A.count)
    
    //MARK: - Process
    for i in 0..<A.count {
        table[i][0] = i
    }
    
    for i in 0..<B.count {
        table[0][i] = i
    }
    
    for i in 1..<A.count {
        for j in 1..<B.count {
            if A[A.index(A.startIndex, offsetBy: i)] == B[B.index(B.startIndex, offsetBy: j)] {
                table[i][j] = table[i - 1][j - 1]
            } else {
                table[i][j] = table[i - 1][j] < table[i][j - 1] ? table[i - 1][j] + 1 : table[i][j - 1] + 1
            }
        }
    }
    
    //MARK: - Output
    print(table[A.count - 1][B.count - 1])
}
solution()

 

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