https://www.acmicpc.net/problem/1935
1935번: 후위 표기식2
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이
www.acmicpc.net
해석 및 팁
이 문제는 후위 표기식을 이해하는 것이 가장 중요합니다. 자세한 것은 링크를 참조하시기 바랍니다.
https://ko.wikipedia.org/wiki/역폴란드_표기법
역폴란드 표기법 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 역폴란드 표기법(RPN, reverse Polish notation) 또는 후위 표기법(후치 표기법)(後位 -, postfix notation)은 연산자를 연산 대상의 뒤에 쓰는 연산 표기법이다. 예를 들어,
ko.wikipedia.org
문자열을 입력받은후 str에 저장합니다. 그다음 알파벳에 해당하는 수가 주어지므로 HashMap에 알파벳과 그에 해당하는 수를 저장합니다. 그다음 반복문을 통해 알파벳이면 해당하는 수를 Stack에 push 합니다. 알파벳이 아닌 경우에는 마지막에 push 된 수 2개를 가지고 연산을 한 후에 다시 push 하면 됩니다. 마지막으로 스택에 남은수를 출력해 주면 됩니다.
Java 코드
import java.util.Scanner;
import java.util.Stack;
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Stack<Double> stack = new Stack<>();
HashMap<Character, Integer> map = new HashMap<>();
int n = sc.nextInt();
String str = sc.next();
for(char i = 'A'; i < 'A' + n; i++) {
map.put(i, sc.nextInt());
}
for(int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if(c >= 65 && c <= 90) stack.push((double)map.get(c));
else {
double a = stack.pop();
double b = stack.pop();
if(c == '+') stack.push(b + a);
else if(c == '-') stack.push(b - a);
else if(c == '*') stack.push(b * a);
else if(c == '/') stack.push(b / a);
}
}
System.out.println(String.format("%.2f", stack.pop()));
}
}
'백준' 카테고리의 다른 글
백준 1449 수리공 항승(Java) (0) | 2023.02.03 |
---|---|
백준 11478 서로 다른 부분 문자열의 개수(Java) (0) | 2023.02.03 |
백준 10451 순열 사이클(Java) (0) | 2023.02.03 |
백준 10972 다음 순열(Java) (1) | 2023.02.03 |
백준 3273 두 수의 합(Java) (0) | 2023.02.03 |