정답율이 33% 정도이지만 Stack을 사용해 푸는 문제라 과감하게 도전했다.
그리고 언제나 조져지는 건 나였다…
전위, 중위, 후위 표기법을 처음 들어보기도 했고 Stack을 사용하는 문제는 처음이라 거의 푸는 방법을 보고 알고리즘을 짰다.
package main
import "fmt"
//Stack 구현
type Stack struct {
stack []rune
}
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 rune) {
s.stack = append(s.stack, v)
}
func (s *Stack) Top() rune {
if !s.IsEmpty() {
return s.stack[len(s.stack)-1]
} else {
return -1
}
}
func main() {
infix := ""
fmt.Scan(&infix)
opStack := Stack{}
postfix := ""
for _, char := range infix {
if char == '+' || char == '-' || char == '*' || char == '/' {
if preced(char) > preced(opStack.Top()) {
opStack.Push(char)
} else {
for preced(char) <= preced(opStack.Top()) {
postfix += string(opStack.Top())
opStack.Pop()
}
opStack.Push(char)
}
} else if char == '(' {
opStack.Push(char)
} else if char == ')' {
for opStack.Top() != '(' {
top := opStack.Top()
postfix += string(top)
opStack.Pop()
}
opStack.Pop()
} else {
postfix += string(char)
}
}
for !opStack.IsEmpty() {
postfix += string(opStack.Top())
opStack.Pop()
}
fmt.Print(postfix)
}
// 우선 순위 판별 함수
func preced(v rune) int {
if v == '+' || v == '-' {
return 1
} else if v == '*' || v == '/' {
return 2
} else {
return 0
}
}
중위 표기법을 후위 표기법으로 바꾸는 방법을 알면 이 문제는 다 푼 것.
opStack
을 만든다.infix
를 왼쪽부터 오른쪽으로 탐색한다.postfix
에 추가한다.opStack
에 추가한다.opStack
에 있는 모든 연산자를 ‘(’를 만날 때까지 postfix
에 추가하고 ‘(’를 제거한다.opStack
의 top 요소보다 우선 순위가 높으면 opStack
에 추가한다.postfix
에 추가하고 문자를 opStack
에 추가한다.opStack
에 남아있는 모든 요소를 postfix
에 추가한다.rune
type❌
go - rune 타입 (한글, 유니코드, UTF-8)
4.9. Infix, Prefix and Postfix Expressions - Problem Solving with Algorithms and Data Structures