Swift Data Structure And Algorithm/Dynamic Programming

ํŒฐ๋ฆฐ๋“œ๋กฌ ๋งŒ๋“ค๊ธฐ

youngjaeLee1026 2022. 4. 12. 17:56

1. ๋ฌธ์ œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-12 17 47 29

2. ์ž…์ถœ๋ ฅ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-12 17 47 37

3. ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-04-12 17 47 44

4. ๋ฌธ์ œ ์„ค๊ณ„

  • Dynamic Programming์˜ ์œ ๋ช…ํ•œ ๋ฌธ์ œ์ธ ํŽธ์ง‘ ๊ฑฐ๋ฆฌ ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐ์ด ๋จ.
  • ํŽธ์ง‘ ๊ฑฐ๋ฆฌ ๋ฌธ์ œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ๋งŒ๋“ค์–ด์•ผ ํ•  ์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž์—ด์„ ๊ฐ๊ฐ ํ–‰๊ณผ ์—ด์— ์•ŒํŒŒ๋ฒณ๋“ค์„ ๋ฐฐ์น˜ํ•œ ํ›„,
  • ๊ฐ™์€ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ๋ฐฐ์น˜ํ–ˆ์œผ๋ฏ€๋กœ ์ฃผ๋Œ€๊ฐ์„ ์€ ๋ชจ๋‘ ๋”์ด์ƒ ์ถ”๊ฐ€ํ•ด์•ผํ•  ์•ŒํŒŒ๋ฒณ์ด ์—†์œผ๋ฏ€๋กœ ๋ชจ๋‘ 0์œผ๋กœ ์ฑ„์šธ ์ˆ˜ ์žˆ์Œ
  • ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ํŽธ์ง‘๊ฑฐ๋ฆฌ ๋ฌธ์ œ์™€ ๊ฐ’์„ ์ฑ„์›Œ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์ด ๋ฐ˜๋Œ€๋กœ ์•„๋ž˜์„œ ๋ถ€ํ„ฐ ์ฑ„์›Œ๋‚˜๊ฐ€์•ผ ํ•จ
  • ๊ฐ’์„ ์ฑ„์šธ ๋•Œ ์กฐ๊ฑด์€ ์ž…๋ ฅ ๋ฐ›์€ ๋ฌธ์ž์—ด์„ str์ด๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, str[i] == str[j]๋ผ๋ฉด, ๋”์ด์ƒ ์ฑ„์šธ ์•ŒํŒŒ๋ฒณ์ด ์—†์œผ๋ฏ€๋กœ, ํ•ด๋‹น ์•ŒํŒŒ๋ฒณ์„ ์ œ์™ธํ•œ ์•ˆ์ชฝ์˜ ์•ŒํŒŒ๋ฒณ๋“ค์ด ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ์ด๋ฃจ๋ฉด ๋˜๋ฏ€๋กœ, ์™ผ์ชฝ ์•„๋ž˜ ๋Œ€๊ฐ์„ ์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๋ฉด ๋˜๊ณ ,
  • str[i]๊ณผ str[j]๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด, ๊ฐ€๋ น, str[i] == b์™€ str[j] == a์ธ ๊ฒฝ์šฐ ba์— a๋ฅผ ๋ถ™์ด๊ฑฐ๋‚˜ ba์— b๋ฅผ ๋ถ™์ด๋Š” ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ ์ค‘ ์ตœ์†Œ๊ฐ’์„ ์„ ํƒํ•ด์•ผ ํ•จ
  • ๊ทธ ๊ฐ’์€ ์•„๋ž˜์˜ ๊ฐ’๊ณผ ์™ผ์ชฝ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์ตœ์†Œ๊ฐ’์— +1 ํ•ด์ค€ ๊ฐ’์„ ํ˜„์žฌ ์œ„์น˜์— ์ €์žฅํ•˜๋ฉด ๋จ
  • ๋”ฐ๋ผ์„œ, table[i][j] = str์„ ํŒฐ๋ฆฐ๋“œ๋กฌ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ํ•ด์•ผํ•  ๋ฌธ์ž์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜
  • table[i][j] = str[i] == str[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 str: String = readLine() else { return }
    table = Array(repeating: Array(repeating: 0, count: str.count), count: str.count)
    
    //MARK: - Process
    for i in 0..<str.count {
        table[i][i] = 0
    }
    
    for i in stride(from: str.count - 1, through: 0, by: -1) {
        for j in stride(from: i + 1, to: str.count, by: 1) {
            if str[str.index(str.startIndex, offsetBy: i)] == str[str.index(str.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[0][str.count - 1])
}
solution()

 

์ „์ฒด์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.