1935번: 후위 표기식2
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이
www.acmicpc.net
후위표기식 관련 문제이다. 후위표기식은 한마디로 연산자가 뒤로 가는거다.
ab+ 는 a+b
abc*+de/- > (b*c)+a - (d/e) 뭐 이런느낌이다.
계산순서를 보면 알 수 있듯, 일단 스택을 활용하는게 상당히 적절해보인다.
일단 만약 알파벳이 5개의 종류대로 숫자가 순서대로 input된다는 점은 상당히 편하다.
5
ABC*+DE/-
1
2
3
4
5
이 예제를 들어 생각해보자.
1. 소수 둘째자리까지 out하라 했으니 숫자의 type은 double이 조금 더 적절해보인다.
2. stack을 활용할건데 문자를 stack에 넣어서 이 문자를 다시 숫자로 변환하는 것 보단, 문자를 받을때 바로 숫자로 변환하는게 더 편해보인다.
다행히 알파벳 순서대로 숫자가 주어지니까 arr이라는 숫자배열을 만든다고 가정하고 (1,2,3,4,5) 순으로 저장
stack.push(arr[str.charat(i)-'A']) 이런식으로 코드를 작성하면 빠르게 stack에다 값을 넣을 수 있다.
3. str을 돌면서 할텐데 문자가 나올 경우 2번 처럼 진행하면 되지만 만약 연산자가 나온다면?
이럴때는 stack에서 두개의 값을 꺼내어서 계산하고 다시 push를 하는 방식이 적절할것 같다.
4. 마무리 소수점 control
나는 DecimalFormat class를 활용해서 #.00형태이기에 (6.2일 경우 뒤에 6.20)이 들어가니 #.00꼴로 저장해야한다.
이 값을 formatting해주면 끝
(아니면 sysout.printf("%.2f") 이런식으로 해도 소수점 control 할 수 있겠다.)
gpt 부연설명.
System.out.printf 메소드에서 사용되는 %.2f 형식 지정자는 다음과 같은 의미를 가집니다:
- %: 형식 지정자의 시작을 나타냅니다. 이 문자 뒤에 나오는 문자들은 출력할 데이터의 형식을 지정합니다.
- .2: 소수점 이하 두 자리까지 출력하도록 지정합니다. 만약 값이 '3.14159'라면 '3.14'로 출력됩니다.
- f: 출력할 데이터의 타입이 실수형(float 또는 double)임을 나타냅니다.
따라서 %.2f는 "실수를 소수점 이하 두 자리까지 출력하라"는 의미를 가집니다. 예를 들어, 다음과 같이 사용할 수 있습니다:
package 스택과큐;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.Stack;
import java.util.StringTokenizer;
public class _1935_후위표기식_again {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String str = br.readLine();
Stack<Double> stack = new Stack<Double>();
double[] arr = new double[n];
for(int i=0; i<n; i++) {
arr[i] = Double.parseDouble(br.readLine());
}
for(int i=0; i<str.length(); i++) {
//문자일 경우
if(str.charAt(i) >= 'A' && str.charAt(i) <= 'Z') {
stack.add(arr[str.charAt(i)-'A']);
}
//연산자일 경우
else {
double first = stack.pop();
double second = stack.pop();
switch(str.charAt(i)){
case '+':{
stack.push(first+second);
break;
}
case '-':{
stack.push(second-first);
break;
}
case '*':{
stack.push(first*second);
break;
}
case '/':{
stack.push(second/first);
break;
}
}
}
}
double ans = stack.pop();
DecimalFormat format = new DecimalFormat("#.00");
String val = format.format(ans);
System.out.println(val);
}
}
'Algorithm_PS' 카테고리의 다른 글
10809. <알파벳 찾기> (0) | 2024.02.05 |
---|---|
1918. <후위 표기식> (1) | 2024.01.29 |
17299. <오등큰수> (1) | 2024.01.29 |
17298_ <오큰수> (0) | 2024.01.16 |
10799_ <쇠막대기> (0) | 2024.01.16 |