백준 알고리즘 1935번
https://www.acmicpc.net/problem/1935
1935번: 후위 표기식2
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이
www.acmicpc.net
1935번
피연산자에 대한 정보와 후위 표기식이 주어졌을 때, 해당 식을 계산한 값을 구하여라.
입력으로 첫 줄에 피연산자의 개수 n이 들어온다. 둘째 줄에 후위 표기식이 주어지고 그 다음 n개의 줄에 걸쳐 각 피연산자에 대응되는 숫자가 주어진다.
출력으로 주어진 후위 표기식에 대한 계산 값을 출력하면 된다.
문제 해결
피연산자가 후위 표기식에서는 알파벳으로 주어지고 나중에 숫자가 따로 들어오기 때문에 파이썬의 dictionary나 자바의 HashMap을 사용해야겠다고 생각했다.
자바의 HashMap을 오랜만에 써보려고 자바를 선택해서 문제를 풀었다.
먼저 알파벳을 key로 하고 숫자를 value로 하는 HashMap operand에 피연산자에 대한 정보를 담았다.
이후에 입력받은 후위 표기식 equation의 문자를 하나씩 보면서 연산자면 Stack에서 2개의 값을 꺼내 연산을 진행하고 해당 값을 다시 stack에 넣어주었다. 만약 피연산자라면 operand에서 value 값을 찾아 Stack에 넣어주었다.
연산을 진행할 때 기억해야 할 것은 Stack에서 먼저 꺼낸 값이 중위 표기식에서 두번째 피연산자가 된다는 것이다.
모든 문자를 보고나면 Stack에 해당 후위표기식의 결과 값이 들어있다.
소수점 2자리까지만 출력해야하기 때문에 String.format()을 사용하였다.
코드
package bj1935;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Stack;
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 equation = br.readLine();
int len = equation.length();
HashMap<Character, Double> operand = new HashMap<>();
for (int i = 0; i < n; i++) {
double temp = Double.parseDouble(br.readLine());
int temp_key = 'A' + i;
operand.put((char) temp_key, temp);
}
Stack<Double> stack = new Stack<>();
for (int i = 0; i < len; i++) {
char chk = equation.charAt(i);
if (chk == '*' || chk == '/' || chk == '+' || chk == '-') {
if (stack.size() >= 2) {
double b = stack.pop();
double a = stack.pop();
switch (chk) {
case '*':
stack.add(a * b);
break;
case '/':
stack.add(a / b);
break;
case '+':
stack.add(a + b);
break;
case '-':
stack.add(a - b);
break;
}
}
}else {
stack.add(operand.get(chk));
}
}
double answer = stack.pop();
System.out.println(String.format("%.2f", answer));
}
}
결과
'Algorithm' 카테고리의 다른 글
Softeer <비밀메뉴> (0) | 2022.05.21 |
---|---|
Softeer <이미지 프로세싱> (0) | 2022.05.20 |
Softeer <마이크로서버> (0) | 2022.05.19 |
백준 17299번 <오등큰수> (0) | 2022.05.19 |
Softeer <트럭> (0) | 2022.05.18 |
댓글