반응형
문제
https://www.acmicpc.net/problem/1935
1935번: 후위 표기식2
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이
www.acmicpc.net
풀이
스택을 사용하여 풀 수 있는 문제
먼저, 이 문제를 풀려면 후위 표기식을 계산하는 방법에 대해 알아야 한다.
- 후위표기식을 계산하는 방법
- 숫자가 들어오면 스택에 넣어줌
- 연산자가 들어오면 스택에서 2개의 숫자를 뽑고 연산 처리
- 다시 스택에 넣음
- 마지막 스택에 남은 수가 계산된 결과
뺄셈과 나눗셈을 순서에 주의하여 풀이하면 쉽게 풀 수 있는 문제
소스코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
enum OperType: Character { | |
case plus = "+" | |
case minus = "-" | |
case multiply = "*" | |
case divisor = "/" | |
func calculate(_ n1: Double, _ n2: Double) -> Double { | |
switch self { | |
case .plus: return n1 + n2 | |
case .minus: return n2 - n1 | |
case .multiply: return n1 * n2 | |
case .divisor: return n2 / n1 | |
} | |
} | |
} | |
let n = Int(readLine()!)! | |
let command = readLine()! | |
var dict: [Character: Double] = [:] | |
var numStack: [Double] = [] | |
for i in 0..<n { | |
dict[Character(UnicodeScalar(i + 65)!)] = Double(readLine()!)! | |
} | |
for cmd in command { | |
if let oper = OperType(rawValue: cmd) { | |
numStack.append(oper.calculate(numStack.removeLast(), numStack.removeLast())) | |
} else { | |
numStack.append(dict[cmd, default: 0]) | |
} | |
} | |
print(String(format: "%.2f", numStack.last!)) |
후기
스택 자료구조의 기본적인 문제이며 후위 표기식 계산 방법에 대해 알아야함
반응형
'PS > 백준' 카테고리의 다른 글
[BOJ] 백준 2475 검증수 (Swift) (0) | 2023.12.11 |
---|---|
[BOJ] 백준 10799 쇠막대기 (Swift) (1) | 2023.11.19 |
[BOJ] 백준 28278 스택 2 (Swift) (0) | 2023.08.15 |
[BOJ] 백준 1205 등수 구하기 (Swift) (0) | 2023.06.14 |
[BOJ] 백준 6080 Bad Grass (Swift) (1) | 2023.06.09 |