import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String expr = br.readLine(); // 수식을 받아서 저장
List<Double> numberList = new ArrayList<>();
for(int i = 0; i < N; i++) {
Double num = Double.parseDouble(br.readLine());
numberList.add(num);
// 숫자를 큐에 저장
}
Stack<Double> numberStack = new Stack<>(); // 연산자와 숫자의 계산 결과를 담는 스택
for (int i = 0; i < expr.length(); i++) {
char ch = expr.charAt(i);
if (ch >= 'A' && ch <= 'Z') { // 알파벳이라면
numberStack.push(numberList.get(ch - 'A'));
} else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
// 연산자라면
double num1 = numberStack.pop();
double num2 = numberStack.pop();
// 큐에서 숫자를 두개 꺼내서
switch (ch) {
case '+':
numberStack.add(num2 + num1);
break;
case '-':
numberStack.add(num2 - num1);
break;
case '*':
numberStack.add(num2 * num1);
break;
case '/':
numberStack.add(num2 / num1);
break;
}
}
}
System.out.printf("%.2f", numberStack.pop());
// System.out.println(numberStack.peek());
}
}
결과
결과는 동일한데 틀렸다가, 답보고 제출했다가 몇 달 지나서 까먹은 채로 재도전해서
로직 맞추고, println() 형식만 틀림.
System.out.printf("%.2f", numberStack.pop());
문제가 소수점 2번째 자리까지 출력이라서 위처럼 표시를 해야 한다.
난항이었던 부분은 AA+A+ 처럼 같은 숫자로 여러번 연산을 하는 경우였다.
그러니까 알파벳의 종류만큼 숫자의 종류가 결정이 되니 그걸 List에 담았다가
문자에서 - 'A'를 뺀 값을 인덱스로 써서 값을 불러와야 한다.
A면 0, B면 1... 이런 식으로 값이 나온다.
ABCDE 순으로 알파벳이 순서대로 나온다는 가정 하에 의미가 있다고 생각함.