https://programmers.co.kr/learn/courses/30/lessons/67257
부호는 총 "+", "-", ""로 세가지이다. 순서는 32*1로 6가지인데, 짧으므로 일일히 orders 배열에 작성한다. expressArr은 express 문자열을 숫자와 부호로 쪼갠다. splitExpression 함수는 밑에 나온다. orders에서 각각 order를 calculate함수를 통해 연산을 한 최종값을 도출한다. 최종값들을 result배열에 넣은 후, 최대값을 구하고 기존 Int타입에서 Int64타입으로 변환한다.
let expression = "100-200*300-500+20"
func solution(_ expression:String) -> Int64 {
var result: [Int] = []
let orders = [["+", "-", "*"], ["+", "*", "-"],
["-", "+", "*"], ["-", "*", "+"],
["*", "+", "-"], ["*", "-", "+"]]
// ["100", "-", "200", "*", "300", "-", "500", "+", "20"]
let expressArr = splitExpression(expression)
for order in orders {
let num = calculate(expressArr, order)
result.append(num)
}
return Int64(result.max()!)
}
splitExpression 함수는 expression을 받아서 쪼갠 배열로 반환하는 함수이다. 재활용하지는 않아서 따로 분리할 필요는 없지만, 가독성을 위해서 분리하였다.
func splitExpression(_ expression: String) -> [String] {
var result: [String] = []
var tmp = ""
for v in expression {
let str = String(v)
if !["+", "-", "*"].contains(str) {
tmp += str
} else {
result.append(tmp)
result.append(str)
tmp = ""
}
}
result.append(tmp)
return result
}
calculate 함수는 쪼개진 express 배열과 order 순서가 있는 배열을 받아, 연산을 한 값을 반환한다. orderArr가 ["+", "-", "*"]인 경우, order "+"에서부터 출발한다. expressArr을 복사한 arr 배열에서 "+" 연산자가 없을 때까지 while문을 돌려 연산한다. arr에서 두 숫자를 제거하여 firstNum, secondNum을 정의한다. 연산을 한 이후에, 연산자의 자리에 연산한 최종 숫자를 넣는다. 연산이 다 끝나면 숫자 하나가 남으므로, 타입을 Int로 변환한 이후에 부호를 없앤다.
func calculate(_ expressArr: [String], _ orderArr: [String]) -> Int {
var arr = expressArr
for order in orderArr {
while arr.contains(order) {
guard let index = arr.firstIndex(of: order) else { break }
let firstNum = arr.remove(at: index - 1)
let secondNum = arr.remove(at: index)
switch order {
case "+": arr[index - 1] = String("\(Int(firstNum)! + Int(secondNum)!)")
case "-": arr[index - 1] = String("\(Int(firstNum)! - Int(secondNum)!)")
case "*": arr[index - 1] = String("\(Int(firstNum)! * Int(secondNum)!)")
default: break
}
}
}
return abs(Int(arr[0])!)
}