[백준] 1935 후위 표기식2 - Java
후위 표기식 문제이다.
지난 시간에 푼 문제는 평범한 식을 후위 표기식으로 변환하는 문제였다면
이번 문제는 반대로 후위 표기식을 평범한 식으로 변환하는 문제이다.
사실 변환할 필요는 없고, 문자에 대한 값이 주어졌을 때 후위 표기식으로 표현된 식의 연산 결과를 구할 수 있으면 된다.
풀이 방법은 간단하다.
문자가 입력되면 문자에 해당하는 값을 스택에 넣어주고
연산자가 입력되면 스택에 있는 값 두 개를 빼서 연산자로 연산을 진행한다.
문자의 값을 지정해 주는 아이디어가 생각이 안 날 수 있는데
double 타입의 배열과 char을 이용해서 처리해 줬다.
코드를 통해 알아보자.
import java.util.*;
public class Main2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Stack<Double> st = new Stack();
int cycle = sc.nextInt();
sc.nextLine();
double[] arr = new double[cycle];
String str = sc.nextLine();
for (int i = 0; i < cycle; i++) {
arr[i] = sc.nextInt();
}
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) >= 'A' && str.charAt(i) <= 'Z') {
st.push(arr[str.charAt(i) - 'A']);
} else if (str.charAt(i) == '*') {
double temp1 = st.pop();
double temp2 = st.pop();
st.push(temp2 * temp1);
} else if (str.charAt(i) == '+') {
double temp1 = st.pop();
double temp2 = st.pop();
st.push(temp2 + temp1);
} else if (str.charAt(i) == '-') {
double temp1 = st.pop();
double temp2 = st.pop();
st.push(temp2 - temp1);
} else if (str.charAt(i) == '/') {
double temp1 = st.pop();
double temp2 = st.pop();
st.push(temp2 / temp1);
}
}
double ans = st.pop();
System.out.print(String.format("%.2f", ans));
}
}
소숫점 둘째 자리까지 표현하기 위해 String.format을 사용했다.
스택을 어떻게 사용할 지를 잘 생각해 봐야겠다.
알고리즘은 아는 만큼 보이고, 푸는 만큼 알게 되는 것 같다.
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 1100 하얀 칸 - Java (0) | 2021.10.29 |
---|---|
[백준] 1874 스택 수열 - Java (0) | 2021.10.29 |
[백준] 1918 후위 표기식 - Java (0) | 2021.10.29 |
[백준] 10799 쇠막대기 - Java (0) | 2021.10.29 |
[백준] 9012 괄호 - Java (0) | 2021.10.29 |
댓글
이 글 공유하기
다른 글
-
[백준] 1100 하얀 칸 - Java
[백준] 1100 하얀 칸 - Java
2021.10.29 -
[백준] 1874 스택 수열 - Java
[백준] 1874 스택 수열 - Java
2021.10.29 -
[백준] 1918 후위 표기식 - Java
[백준] 1918 후위 표기식 - Java
2021.10.29 -
[백준] 10799 쇠막대기 - Java
[백준] 10799 쇠막대기 - Java
2021.10.29