import java.io.*;
import java.util.*;
class Main {
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 피연산자의 개수 N
int N = Integer.parseInt(br.readLine());
// 피연산자는 A-Z 영대문자이며, A부터 순서대로 N개의 영대문자만 사용
char[] array = br.readLine().toCharArray();
// 후입선출의 자료구조 Stack선언
Stack < Double > stack = new Stack < > ();
// 키와 값으로 구성된 Map선언
Map < Character, Double > map = new HashMap < > ();
// N의 개수만큼 피연산자에 대응되는 값을 설정
char key = 'A';
for (int i = 0; i < N; i++) {
map.put(key, Double.parseDouble(br.readLine()));
key++;
}
// array의 길이만큼 반복문 수행
for (int i = 0; i < array.length; i++) {
// 인덱스의 값이 A-Z인 경우
if ('A' <= array[i] && array[i] <= 'Z') {
stack.push(map.get(array[i]));
}
// 그외의 경우
else {
double answer1 = stack.pop();
double answer2 = stack.pop();
switch (array[i]) {
case '+':
stack.push(answer2 + answer1);
break;
case '-':
stack.push(answer2 - answer1);
break;
case '*':
stack.push(answer2 * answer1);
break;
case '/':
stack.push(answer2 / answer1);
break;
}
}
}
// 결과 값 출력
System.out.println(String.format("%.2f", stack.pop()));
}
}
해결방법
피연산자의 개수 N을 사용자로부터 입력받는다.
피연산자는 A-Z 영대문자이며, A부터 순서대로 N개의 영대문자만 사용한다. 예를들어, N이 5일 경우 A, B, C, D, E의 대응되는 값을 사용자로부터 입력받는다.
각 알파벳에 대응되는 값을 설정하기 위해서 Map을 사용하였고 KEY
로 알파벳을 받고, VALUE
로 대응되는 값을 입력받는다.
배열의 길이만큼 반복문을 수행한다.
반복문 내부는 두 가지 조건으로 수행되는데, 배열의 i
번째 값이 알파벳인 경우와 연산자인 경우로 나뉜다.
배열의 i
번째 값이 알파벳인 경우, 스택에 알파벳에 대응되는 값을 넣어준다.
배열의 i
번째 값이 연산자인 경우, 계산을 하기 위해 스택에 넣었던 두개의 값을 빼내 선언한 answer1
변수와 answer2
변수에 저장한다. Switch-case문을 사용하여 연산자에 맞는 계산을 수행한다. 이때, answer2
가 처음에 배치되어야 한다. 그 이유는 스택은 후입선출의 특징을 갖고 있기 때문이다.
String.format
메소드를 사용하여 소수점 2자리까지 결과 값을 표현한다.