[Go] 백준 1935번: 후위 표기식2

엄기훈·2022년 6월 5일
0

알고리즘 풀이

목록 보기
6/9
post-thumbnail

❓ 문제

1935번: 후위 표기식2

지난 후위 표기식 문제를 이은 두 번째 문제다.

이번에는 후위 표기식이 주어졌을 때 결과를 계산하는 문제인데, 이전 문제를 풀면서 후위 표기식을 이해했다면 간단하게 풀 수 있는 문제이다.

개인적으로 이 문제와 이전 문제의 순서가 바뀌어야 하지 않을까 할 정도로 이 문제는 쉬웠다.

⌨️ 전체 코드

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())
}

💡 풀이

  1. 피연사자의 실제값을 매핑하기 위한 Map operands를 정의한다.
    • 문제에 주어지는 실제값은 A, B, C… 순서이므로 반복문을 돌면서 operands에 저장하면 된다.
  2. 결과를 임시 저장하는 Stack resultStack을 정의한다.
  3. 주어진 후위 표기식 postfix를 왼쪽에서 오른쪽으로 탐색한다.
    1. 탐색한 문자가 피연산자(A, B, C.. 등)라면 그 피연산자에 대응하는 실제값을 resultStack에 넣는다.
    2. 탐색한 문자가 연산자(+, -, *, /)라면 resultStack에서 두 개의 값을 빼서 각각 op2, op1에 저장한다.
      • 처음 뺀 값을 op2, 나중에 뺀 값을 op1에 저장해야 한다. 왜냐하면 나누기는 교환법칙이 성립하지 않기 때문이다.
    3. 연산자에 대응하는 계산을 한 후 그 결과를 resultStack에 저장한다.
      • 이 때, 계산은 op1, op2 순서로 한다.
  4. 3의 과정이 끝났다면 resultStack에는 값이 하나만 남고 그게 최종 결과값이다.

🔁 삽질

  • 삽질까지는 아니지만 나누기는 교환법칙이 성립하지 않기 때문에 계산 순서를 적절히 조정해 주어야 한다.

📖 새롭게 배운 내용

💫 헷갈리는 부분

📚 참고 자료

profile
한 번 더 고민해보는 개발자

0개의 댓글