후위 표기식은 먼저 연산의 대상이 되는 두 수가 나오고 그 후에 연산자가 등장합니다. 즉 연산자를 만나면 최근에 나온 두 수를 해당 연산자로 연산을 하면 된다는 것입니다. 후위 표기식을 계산하기 위해서는 자료구조 Stack을 활용합니다. 수가 나오면 stack에 push 하고 연산자가 나오면 stack에서 수 2개를 pop해서 연산하면 됩니다.
import Foundation
// 연산하는 함수
func operate(_ a: Double, _ b: Double, _ operand: String) -> Double {
switch operand {
case "+": return a + b
case "-": return b - a //❗️ 연산 순서에 주의
case "*": return a * b
case "/": return b / a //❗️ 연산 순서에 주의
default: return 0
}
}
// 해당 피연산자의 index를 얻는 extension
// A부터 순서대로 배열에 저장하므로 아스키코드를 이용해서 "A"가 0을 기준으로 구하면 된다.
extension String {
var index: Int {
return Int(Character(self).asciiValue! - Character("A").asciiValue!)
}
}
// 연산자들
let operands = ["+", "-", "*", "/"]
// 입력 받기: 피연산자 갯수
let N = Int(readLine()!)!
// 반복문을 돌리기 좋게 식을 배열로 바꾼다
let expression = readLine()!.map { String($0) }
// 피연산자 값을 저장하는 배열
var nums = [Double]()
// 스택
var stack = [Double]()
// 피연산자 값을 배열에 저장
for _ in 0..<N {
nums.append(Double(readLine()!)!)
}
for char in expression {
if !operands.contains(char) { //👉 피연산자가 아니라면
stack.append(nums[char.index]) //👉 배열에 저장
} else { //👉 피연산자라면
let a = stack.popLast()!
let b = stack.popLast()! //👉 최근 2개를 pop해서
stack.append(operate(a, b, char)) //👉 연산해서 stack에 넣는다.
}
}
print(String(format: "%.02f", stack.popLast()!)) //👉 소수점 2째자리까지의 String으로 바꾸어 출력