[Swift] 241. Different Ways to Add Parentheses

Tae-Kyun Kim·2022년 5월 28일
1
post-thumbnail

나의 풀이

import Foundation

extension String {
    func isDigit() -> Bool {
        var i = self.startIndex
        
        for s in self {
            if s.isNumber == false {
                break
            }
            i = self.index(after: i)
        }
        return i == self.endIndex
    }
}


class Solution {
    func eval(_ left: Int, _ right: Int, _ op: Character) -> Int {
        switch op {
        case "*":
            return left * right
        case "-":
            return left - right
        case "+":
            return left + right
        default:
            return fatalError()
        }
    }


    func compute(_ left: [Int], _ right: [Int], _ op: Character) -> [Int] {
        var result: [Int] = []
        for l in left {
            for r in right {
                result.append(eval(l, r, op))
            }
        }
        return result
    }

    func diffWaysToCompute(_ expression: String) -> [Int] {
        var left: [Int] = []
        var right: [Int] = []
        var results: [Int] = []
        var i = expression.startIndex

        if expression.isDigit() {
            return [Int(expression)!]
        }

        expression.forEach { v in
            if v == "*" || v == "-" || v == "+" {
                left = diffWaysToCompute(String(expression[expression.startIndex..<i]))
                right = diffWaysToCompute(String(expression[expression.index(after: i)..<expression.endIndex]))
                results.append(contentsOf: compute(left, right, v))
            }
            i = expression.index(after: i)
        }
        return results
    }
}

회고

  • String 타입이 python과 다르게 index와 substr을 관리하는 것이 어려웠다.
  • 리트코드의 다른 풀이를 참고하니 대부분 Array 로 변환해서 풀이하는 것 확인

0개의 댓글