문제
풀이 코드
import Foundation
let N = Int(readLine()!)!
let formula = readLine()!
var num = [Int]()
var answer = [Double]()
for _ in 0..<N {
num.append(Int(readLine()!)!)
}
for op in formula {
switch op {
case "*":
answer.append(answer.removeLast() * answer.removeLast())
case "/":
let stackLast = answer.removeLast()
answer.append(answer.removeLast() / stackLast)
case "+":
answer.append(answer.removeLast() + answer.removeLast())
case "-":
let stackLast = answer.removeLast()
answer.append(answer.removeLast() - stackLast)
default:
let idx = op.asciiValue! - 65
answer.append(Double(num[Int(idx)]))
}
}
print(String(format: "%.2f", answer.removeLast()))
풀이 과정
알파벳을 포함한 별도의 배열을 선언해 주고 계산을 해야하나 고민했는데,
Ascii 코드를 이용해서 인덱스를 할당하여 구현하면 된다고 생각했다.
A 의 아스키 코드는 65 이고, 입력받은 숫자들을 별도의 배열로 지정하여
A 일때는 0인덱스의 수를, B일때는 1인덱스의 수를 ... 이렇게 할당하면 될것같았다.
그렇게 그냥 스택을 이용해 풀이를 해주었고, 고려해야 할 점은 두가지였다.
- 와 / 인데,
덧셈과 곱셈의 경우 순서가 상관 없지만, 뺄셈과 나눗셈은 순서가 중요하기 때문에, 먼저 removeLast 를 수행하여 순서를 지정해 주었다.
이렇게 풀고 소숫점 2번째 자리까지만 출력하기 위해
String의 format 을 이용해 C언어의 printf 처럼 할당해 주었다