[Silver III] 후위 표기식2 - 1935
성능 요약
메모리: 79516 KB, 시간: 12 ms
분류
자료 구조, 스택
제출 일자
2023년 12월 20일 16:48:03
문제 설명
후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.
입력
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.
후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.
출력
계산 결과를 소숫점 둘째 자리까지 출력한다.
풀이
후위 표기식이란 피연산자(ex. 숫자) 뒤에 연산자(ex. +, -, *, % 등)가 나타나는 표기법으로, 장점으로는 괄호를 사용하지 않아도 된다는 점이 있습니다.
후위 표기식은 스택을 통해 구현할 수 있는데, 연산자가 나타나면
1) 스택에서 pop을 2번 하고, 2) 해당 값들끼리 연산을 해준 뒤, 3) 결과를 다시 스택에 push해주면 됩니다.
위의 식만 알고 있으면 문제를 푸는 데에는 어려움이 없을 것이라 생각됩니다.
따라서 식은 다음과 같습니다.
import Foundation
let n = Int(readLine()!)!
let postfix = readLine()!
var (values, stack) = ([Character: Double](), [Double]())
// MARK: - 알파벳 순서대로 딕셔너리에 값 추가하기
for i in 0..<n {
let alphabet = Character(UnicodeScalar(65 + i)!)
values[alphabet] = Double(readLine()!)!
}
for char in postfix {
if char >= "A", char <= "Z" {
stack.append(values[char]!)
} else {
switch char {
case "+":
let x = stack.last!
stack.removeLast()
let y = stack.last!
stack.removeLast()
stack.append(y + x)
case "-":
let x = stack.last!
stack.removeLast()
let y = stack.last!
stack.removeLast()
stack.append(y - x)
case "*":
let x = stack.last!
stack.removeLast()
let y = stack.last!
stack.removeLast()
stack.append(y * x)
case "/":
let x = stack.last!
stack.removeLast()
let y = stack.last!
stack.removeLast()
stack.append(y / x)
default:
continue
}
}
}
// format:을 쓰기 위해선 Foundation을 import 해줘야 함
print(String(format: "%.2f", stack.first!))
'PS > BOJ' 카테고리의 다른 글
[백준(BOJ)] 2841 외계인의 기타 연주 - 스위프트 (Swift) (2) | 2023.12.28 |
---|---|
[백준(BOJ)] 9935 문자열 폭발 - 스위프트(Swift) (0) | 2023.12.28 |
[백준(BOJ)] 10799 쇠막대기 - 스위프트(Swift) (2) | 2023.12.20 |
[백준 (BOJ)] 2590 색종이 - 스위프트(Swift) (0) | 2023.11.13 |
[백준(BOJ)] 2212 센서 - 스위프트(Swift) (0) | 2023.11.13 |
[Silver III] 후위 표기식2 - 1935
성능 요약
메모리: 79516 KB, 시간: 12 ms
분류
자료 구조, 스택
제출 일자
2023년 12월 20일 16:48:03
문제 설명
후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.
입력
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.
후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.
출력
계산 결과를 소숫점 둘째 자리까지 출력한다.
풀이
후위 표기식이란 피연산자(ex. 숫자) 뒤에 연산자(ex. +, -, *, % 등)가 나타나는 표기법으로, 장점으로는 괄호를 사용하지 않아도 된다는 점이 있습니다.
후위 표기식은 스택을 통해 구현할 수 있는데, 연산자가 나타나면
1) 스택에서 pop을 2번 하고, 2) 해당 값들끼리 연산을 해준 뒤, 3) 결과를 다시 스택에 push해주면 됩니다.
위의 식만 알고 있으면 문제를 푸는 데에는 어려움이 없을 것이라 생각됩니다.
따라서 식은 다음과 같습니다.
import Foundation
let n = Int(readLine()!)!
let postfix = readLine()!
var (values, stack) = ([Character: Double](), [Double]())
// MARK: - 알파벳 순서대로 딕셔너리에 값 추가하기
for i in 0..<n {
let alphabet = Character(UnicodeScalar(65 + i)!)
values[alphabet] = Double(readLine()!)!
}
for char in postfix {
if char >= "A", char <= "Z" {
stack.append(values[char]!)
} else {
switch char {
case "+":
let x = stack.last!
stack.removeLast()
let y = stack.last!
stack.removeLast()
stack.append(y + x)
case "-":
let x = stack.last!
stack.removeLast()
let y = stack.last!
stack.removeLast()
stack.append(y - x)
case "*":
let x = stack.last!
stack.removeLast()
let y = stack.last!
stack.removeLast()
stack.append(y * x)
case "/":
let x = stack.last!
stack.removeLast()
let y = stack.last!
stack.removeLast()
stack.append(y / x)
default:
continue
}
}
}
// format:을 쓰기 위해선 Foundation을 import 해줘야 함
print(String(format: "%.2f", stack.first!))
'PS > BOJ' 카테고리의 다른 글
[백준(BOJ)] 2841 외계인의 기타 연주 - 스위프트 (Swift) (2) | 2023.12.28 |
---|---|
[백준(BOJ)] 9935 문자열 폭발 - 스위프트(Swift) (0) | 2023.12.28 |
[백준(BOJ)] 10799 쇠막대기 - 스위프트(Swift) (2) | 2023.12.20 |
[백준 (BOJ)] 2590 색종이 - 스위프트(Swift) (0) | 2023.11.13 |
[백준(BOJ)] 2212 센서 - 스위프트(Swift) (0) | 2023.11.13 |