지난 후위 표기식 문제를 이은 두 번째 문제다.
이번에는 후위 표기식이 주어졌을 때 결과를 계산하는 문제인데, 이전 문제를 풀면서 후위 표기식을 이해했다면 간단하게 풀 수 있는 문제이다.
개인적으로 이 문제와 이전 문제의 순서가 바뀌어야 하지 않을까 할 정도로 이 문제는 쉬웠다.
package main
import "fmt"
//Stack 구현
type Stack struct {
stack []float64
}
func (s Stack) IsEmpty() bool {
return len(s.stack) == 0
}
func (s *Stack) Pop() {
if !s.IsEmpty() {
s.stack = s.stack[:len(s.stack)-1]
}
}
func (s *Stack) Push(v float64) {
s.stack = append(s.stack, v)
}
func (s *Stack) Top() float64 {
if !s.IsEmpty() {
return s.stack[len(s.stack)-1]
} else {
return -1
}
}
//알고리즘 풀이
func main() {
N := 0
fmt.Scan(&N)
postfix := ""
fmt.Scan(&postfix)
operands := map[rune]float64{}
operand := 'A'
for i := 0; i < N; i++ {
input := 0.0
fmt.Scan(&input)
operands[operand] = input
operand++
}
resultStack := Stack{}
for _, char := range postfix {
if char == '+' || char == '-' || char == '*' || char == '/' {
op2 := resultStack.Top()
resultStack.Pop()
op1 := resultStack.Top()
resultStack.Pop()
result := 0.0
switch char {
case '+':
result = op1 + op2
case '-':
result = op1 - op2
case '*':
result = op1 * op2
case '/':
result = op1 / op2
}
resultStack.Push(result)
} else {
resultStack.Push(operands[char])
}
}
fmt.Printf("%.2f", resultStack.Top())
}
operands
를 정의한다.operands
에 저장하면 된다.resultStack
을 정의한다.postfix
를 왼쪽에서 오른쪽으로 탐색한다.resultStack
에서 두 개의 값을 빼서 각각 op2
, op1
에 저장한다.op2
, 나중에 뺀 값을 op1
에 저장해야 한다. 왜냐하면 나누기는 교환법칙이 성립하지 않기 때문이다.resultStack
에 저장한다.op1
, op2
순서로 한다.resultStack
에는 값이 하나만 남고 그게 최종 결과값이다.❌
❌
❌