[1935] 후위 표기식2
카테고리: BOJ
[Silver III] 후위 표기식2 - 1935
성능 요약
메모리: 14600 KB, 시간: 136 ms
분류
자료 구조, 스택
문제 설명
후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.
입력
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.
후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.
출력
계산 결과를 소숫점 둘째 자리까지 출력한다.
아이디어
후위 표기식의 계산 방법만 알면 간단히 풀 수 있는 문제였다.
stack
자료구조를 이용해서 구현했다.
추가로, double형 데이터의 출력 포멧팅에 대해서도 복습할 수 있는 시간이었다.
답안코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
String[] ss = br.readLine().split("");
List<String> operator = Arrays.asList("+", "-", "*", "/");
// 각 변수에 맞는 숫자 변환
for (int i = 0; i < n; i++) {
String num = br.readLine();
for (int j = 0; j < ss.length; j++) {
if (ss[j].equals(Character.toString('A' + i))) {
ss[j] = num;
}
}
}
// stack을 사용한 후위 연산 수행
Deque<String> stack = new ArrayDeque<>();
for (String s : ss) {
if (operator.contains(s)) {
double y = Double.parseDouble(stack.pop());
double x = Double.parseDouble(stack.pop());
if (s.equals("+")) {
stack.push(String.format("%.2f", x + y));
} else if (s.equals("-")) {
stack.push(String.format("%.2f", x - y));
} else if (s.equals("*")) {
stack.push(String.format("%.2f", x * y));
} else {
stack.push(String.format("%.2f", x / y));
}
} else {
stack.push(s);
}
}
bw.write(stack.pop());
bw.flush();
bw.close();
}
}
댓글 남기기