2022. 8. 14. 01:15ㆍALGORITHM/Swift
문제링크
1935번: 후위 표기식2
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이
www.acmicpc.net
문제
후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.
입력
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.
후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.
출력
계산 결과를 소숫점 둘째 자리까지 출력한다.
![](https://blog.kakaocdn.net/dn/dVTXQ7/btrJDiWJodh/UZEkWjpGpxnNKTbDYK15sK/img.png)
분석
후위표기식을 거꾸로 중위표기식으로 변경
풀이 과정
문자가 나오면 스택에 넣어준다
연산자가 나오면
두개의 문자를 가지고 연산을 진행
답을 결과값에 넣어주고
다시 연산자가 나오면 결과값과 연산을 진행
풀이
import Foundation
let num = Int(readLine()!)!
let input = Array(readLine()!).map {String($0)}
var dic = [String : Double]()
for i in 0..<num {
let result = String(UnicodeScalar(65 + i)!)
dic[result] = Double(readLine()!)!
}
var arr = [Double]()
for i in input {
let asci = Int(UnicodeScalar(i)!.value)
if asci > 64 && asci < 91 {
arr.append(dic[i]!)
} else {
let a = arr.popLast()!
let b = arr.popLast()!
if i == "*" {
arr.append(b*a)
} else if i == "+" {
arr.append(b+a)
} else if i == "-" {
arr.append(b-a)
} else {
arr.append(b/a)
}
}
}
print(String(format: "%.2f", arr[0]))
결과
알게된 점
컴파일오류
임포트를 해주자!
import Foundation
다른 풀이
for i in input {
switch i {
case "A"..."Z" :
...
default:
...
}
}
이렇게 연산자와 피연산자를 나눠줄 수 있구만..
'ALGORITHM > Swift' 카테고리의 다른 글
[알고리즘] Swift -백준 #1182 (부분수열의 합) -조합/브루트포스/백트래킹 (0) | 2022.08.20 |
---|---|
[알고리즘] Swift -백준 #14235 (크리스마스 선물) (0) | 2022.08.14 |
[알고리즘] Swift -백준 #5397 (키로거) (2) | 2022.08.14 |
[알고리즘] Swift -백준 #13417 (카드 문자열) (0) | 2022.08.13 |
[알고리즘] Swift -백준 #10799 (쇠막대기) (0) | 2022.08.13 |