[Swift] 백준 1918 - 후위표기식

sun02·2021년 11월 11일
0

알고리즘

목록 보기
15/52

문제 링크

중위표기식을 후위표기식으로 바꿔주는 문제이다.

먼저 연산자를 담을 opStack이 필요하다.
알파벳은 그대로 출력하고,
연산자인 경우 opStack안의 연산자와 우선순위를 비교하여
자신보다 opStack의 제일 윗 연산자가 우선순위가 높다면,
opStack에 removeLast()하거나 opStack에 연산자를 append한다.

입력받은 문자열의 character를 다음과 같은 경우로 나누었다.

  • "(" 인 경우 : opStack에 append한다.
  • ")" 인 경우 : opStack의 제일 윗 원소가 (이 될 때까지 opStack.removeLast()
  • "+" 또는 "-"인 경우 : opStack의 제일 윗 원소가 (가 아니라면 opStack.removeLast()
    • "+"나 "-"가 "*"와 "/"보다 우선순위가 높아지는 경우는 괄호 안에 있을 때 뿐이기 때문이다.
  • "*"와 "/"인 경우 : opStack의 제일 윗 원소가 "곱하기"또는 "/"일 때까지 opStack.removeLast()
    • "*"와 "/"보다 우선순위가 높은 경우는 서로인 곱하기와 나누이 인 경우 밖에 없기 때문이다
  • 알파벳인 경우 : 출력한다.

opStack.removeLast() : opStack의 제일 윗 원소를 pop하고 그 값을 출력한다.

최종 코드


import Foundation

let line = readLine()!
var opStack = ""

for char in line {
    
    if char == "(" {
        
        opStack.append(char)
    } else if char == ")" {
        
        while !opStack.isEmpty && opStack.last != "(" {
            print(opStack.removeLast(),terminator: "")

        }
        opStack.removeLast()
        
    } else if (char == "*" || char == "/") {
        while !opStack.isEmpty && (opStack.last == "*" || opStack.last == "/") {
            print(opStack.removeLast(),terminator: "")

        }
        opStack.append(char)
        
    } else if (char == "+" || char == "-") {
        while !opStack.isEmpty && opStack.last != "(" {
            print(opStack.removeLast(),terminator: "")
        }
        opStack.append(char)
    } else {
        print(char,terminator: "")
        
    }
    
}

while !opStack.isEmpty {
    print(opStack.removeLast(),terminator: "")
}
  • 매번 출력하지 않고 결과 문자열을 하나 만들어서 거기에 추가한 뒤에 한 번에 출력하는 방식도 괜찮을 것 같다!

0개의 댓글