(Swift) 백준 1935 후위 표기식2

SteadySlower·2022년 6월 7일
0

Coding Test

목록 보기
58/298

1935번: 후위 표기식2

후위 표기식 이란?

역폴란드 표기법 - 위키백과, 우리 모두의 백과사전

후위 표기식은 먼저 연산의 대상이 되는 두 수가 나오고 그 후에 연산자가 등장합니다. 즉 연산자를 만나면 최근에 나온 두 수를 해당 연산자로 연산을 하면 된다는 것입니다. 후위 표기식을 계산하기 위해서는 자료구조 Stack을 활용합니다. 수가 나오면 stack에 push 하고 연산자가 나오면 stack에서 수 2개를 pop해서 연산하면 됩니다.

구현

  1. 빼기와 나누기의 경우, 연산의 순서에 주의합시다!
  2. 같은 피연산자가 여러번 나오기도 하므로 아스키코드를 활용해서 index를 구하고 값을 참조할 때 활용합니다.
import Foundation

// 연산하는 함수
func operate(_ a: Double, _ b: Double, _ operand: String) -> Double {
    switch operand {
    case "+": return a + b
    case "-": return b - a //❗️ 연산 순서에 주의
    case "*": return a * b
    case "/": return b / a //❗️ 연산 순서에 주의
    default: return 0
    }
}

// 해당 피연산자의 index를 얻는 extension
    // A부터 순서대로 배열에 저장하므로 아스키코드를 이용해서 "A"가 0을 기준으로 구하면 된다.
extension String {
    var index: Int {
        return Int(Character(self).asciiValue! - Character("A").asciiValue!)
    }
}

// 연산자들
let operands = ["+", "-", "*", "/"]

// 입력 받기: 피연산자 갯수
let N = Int(readLine()!)!

// 반복문을 돌리기 좋게 식을 배열로 바꾼다
let expression = readLine()!.map { String($0) }

// 피연산자 값을 저장하는 배열
var nums = [Double]()

// 스택
var stack = [Double]()

// 피연산자 값을 배열에 저장
for _ in 0..<N {
    nums.append(Double(readLine()!)!)
}

for char in expression {
    if !operands.contains(char) { //👉 피연산자가 아니라면
        stack.append(nums[char.index]) //👉 배열에 저장
    } else { //👉 피연산자라면
        let a = stack.popLast()!
        let b = stack.popLast()! //👉 최근 2개를 pop해서
        stack.append(operate(a, b, char)) //👉 연산해서 stack에 넣는다.
    }
}

print(String(format: "%.02f", stack.popLast()!)) //👉 소수점 2째자리까지의 String으로 바꾸어 출력
profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글