코디잉
1935번: 후위 표기식2 [JAVA] 본문
https://www.acmicpc.net/problem/1935
1935번: 후위 표기식2
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이
www.acmicpc.net
*후위표기식
스택에 피연산자를 넣고, 연산자가 나오면 꺼내서 계산하고 다시 넣어주면 된다.
ex. 123*+45/-
stack.push(1); stack.push(2); stack.push(3);
연산자 *가 나왔으니까 stack.pop() 2번해서 숫자 2개 꺼내서
결과값을 다시 stack.push(2*3)로 넣어준다.
→ 2번째로 pop한 숫자 연산자 1번째로 pop한 숫자
접근 방식)
1. 피연산자가 A~Z까지 순서대로 N개의 사용된다고 하니 N칸의 배열 만들어서 해당하는 값을 넣어준다.
(아스키코드 사용해서 값 꺼내올 예정)
2. Double 타입의 Stack만들어서 문자열 길이만큼 돌면서
2-1)문자열.charAt()이 알파벳 중 하나라면, stack.push()한다. → 배열에 저장해놓은 값을 이용해서 stack에 값 넣어줌!
2-2)알파벳 아니라면, switch문 돌면서 계산해서 다시 stack.push(계산한값) 해준다.
3. stack에 남아있는 결과값을 소숫점 둘째 자리까지만 출력되도록 한다.
package tony_git.data_structure;
import java.io.*;
import java.util.*;
public class B_1935 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String s = br.readLine();
// 사용되는 알파벳의 값 저장
double[] alphabet = new double[26];
for (int i = 0; i < N; i++) {
alphabet[i] = Double.parseDouble(br.readLine());
}
Stack<Double> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char now = s.charAt(i);
if (now >= 'A' && now <= 'Z') {
stack.push(alphabet[now - 'A']);
} else {
double num1 = stack.pop();
double num2 = stack.pop();
switch(now) {
case '+':
stack.push(num2 + num1);
break;
case '-':
stack.push(num2 - num1);
break;
case '*':
stack.push(num2 * num1);
break;
case '/':
stack.push(num2 / num1);
break;
}
}
}
System.out.printf("%.2f\n", stack.pop());
}
}
'자료구조&알고리즘 > 백준' 카테고리의 다른 글
11279번: 최대 힙 [JAVA] (0) | 2023.07.20 |
---|---|
2346번: 풍선 터뜨리기 [JAVA] (0) | 2023.07.19 |
9012번: 괄호 [JAVA] (0) | 2023.07.18 |
10811번: 바구니 뒤집기 [JAVA] (0) | 2023.07.17 |
2751번: 수 정렬하기 2 [JAVA] (0) | 2023.07.16 |
Comments