반응형

후위 표기식을 구현하는 문제이다.
사실 알파벳 마다 숫자를 대응시키는 것만 잘 해줬다면 큰 어려움 없이 쉽게 풀 수 있을 듯?
나 같은 경우에는 N개 만큼 배열 n_list를 만들어서 알파벳 A를 입력받으면 n_list[(int)A-65]에 그 수를 담고, 이후에 알파벳을 만나면 그 배열에서 수를 꺼내서 스택에 담는 형태로 코딩했다.
사실 나는 후위표기식에서 처음 pop()한 수가 오른쪽 피연산자가 되는 줄 모르고 계속 왼쪽에 두고 짰다가 이상한 결과가 나와서… 이번 기회에 제대로 배워간다…
import java.io.*;
import java.util.Stack;
public class Postfix2_1935 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Stack<Double> stack = new Stack<>();
int N = stoi(br.readLine());
int[] n_list = new int[N]; // 각 알파벳에 대응되는 수를 담을 배열
String str = br.readLine();
for (int i=0; i<N;i ++) { // n_list에 각 알파벳과 대응되는 수를 담는다
int ent = stoi(br.readLine());
n_list[i] = ent;
}
double tmp_a, tmp_b; // 나중에 pop()해서 연산할 값들(피연산자)
for (int i=0; i<str.length(); i++) {
char c = str.charAt(i);
switch (c) {
case '+':
tmp_b = stack.pop(); // 먼저 꺼낸 값이 오른쪽 피연산자에 들어간다
tmp_a = stack.pop(); // 나중에 꺼낸 값이 왼쪽 피연산자에 들어간다
stack.push(tmp_a + tmp_b);
break;
case '-':
tmp_b = stack.pop();
tmp_a = stack.pop();
stack.push(tmp_a - tmp_b);
break;
case '*':
tmp_b = stack.pop();
tmp_a = stack.pop();
stack.push(tmp_a * tmp_b);
break;
case '/':
tmp_b = stack.pop();
tmp_a = stack.pop();
stack.push(tmp_a / tmp_b);
break;
default: // 연산자가 아니라 알파벳인 경우
int num = (int)c - 65; // 그 알파벳에 해당하는 배열 인덱스를 구함
stack.push((double)n_list[num]); // 그 인덱스의 배열 요소를 꺼내 스택에 담음
break;
}
}
System.out.printf("%.2f", stack.pop());
}
public static int stoi(String str) {
return Integer.parseInt(str);
}
}
로그인
www.acmicpc.net
작성일자: 2023-09-04
'컴퓨터 공학 > 백준' 카테고리의 다른 글
[백준] JAVA 자바 : 알파벳 개수 (10808번) (0) | 2024.01.20 |
---|---|
[백준] JAVA 자바 : 후위 표기식 (1918번) (0) | 2024.01.20 |
[백준] JAVA 자바 : 오등큰수 (17299번) (0) | 2024.01.20 |
[백준] JAVA 자바 : 오큰수 (17298번) (0) | 2024.01.20 |
[백준] JAVA 자바 : 쇠막대기 (10799번) (0) | 2024.01.20 |