WonniOS

[Swift] 11. 백준 1935번: 후위 표기식2 본문

Algorithm

[Swift] 11. 백준 1935번: 후위 표기식2

Wonni 2023. 4. 5. 19:29
 

후위표기식이란 1+2*3이 있다면 123*+ 처럼 연산자를 피연산자 뒤에 써주는 것이다.

후위표기식은 기본적으로 stack을 사용해 계산을 해서 컴퓨터가 더 이해하기 쉽다.

이 문제는 stack을 어떻게 활용할지만 알면 대충 감이 잡히는 문제였다.


문제 링크

https://www.acmicpc.net/problem/1935

 

1935번: 후위 표기식2

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이

www.acmicpc.net

 


풀이

 

1. 백준에 나온 예제 입력1으로 예시를 들어보면
   일단 input을 그대로 받은 다음, 한 단어씩 살펴보면서 연산자가 나올때까지 stack에 push를 해주었다.
   (이때, 그냥 push 하는게 아니라 아스키코드를 이용해 index에 접근해서 push해야 한다.)

2. 그러다가 연산자가 나오면 stack의 마지막에 있는 2개를 서로 연산해주고, stack에서 지운다. 이때 연산한 결과 값은 다시 stack으로 push한다.

 


 

제출 코드

import Foundation


class B1935 {
  func solution() {

    let count = Int(readLine()!)!
      let input = readLine()!
      var num: [Double] = []
      var stack: [Double] = []
    
        for _ in 0..<count {
          num.append(Double(readLine()!)!)
        }
        
        for i in input {
          switch i {
          case "*":
            stack.append(stack.removeLast() * stack.removeLast())
          case "+":
            stack.append(stack.removeLast() + stack.removeLast())
          case "-":
            let first = stack.removeLast()
            let second = stack.removeLast()
            stack.append(second - first)
          case "/":
            let first = stack.removeLast()
            let second = stack.removeLast()
            stack.append(second/first)
          default:
            let index = i.asciiValue! - 65
            stack.append(num[Int(index)])
          }
        }
        print(String(format: "%.2f", stack[0]))
  }
}

 

마무리 & 새롭게 알게된 점

아스키 코드를 이용해서 Index에 접근해야한다는 건 떠올리기 좀 어려웠다.

아스키 코드와 친해져봅시다...!