JAVA Developer Training
16. 1935번 후위 표기식2 본문
내가 생각한 핵심은
1. 각 알파벳에 내가 입력한 수가 매칭되게 하는것
2. 연산자들을 각 연산자에맞게 기능을 부여하는것
3. 알파벳들을 이용해 알파벳에 매칭된 수로 계산하는것
1. 각 알파벳에 내가 입력한 숫자를 부여, 매칭시키기
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(br.readLine());
Map<Character, Integer> map = new HashMap<>();
Stack<Double> stack = new Stack<>();
String string = br.readLine();
//입력받는 알파벳들 A to Z 에 입력받는 수를 매칭시켜줌
char key = 'A';
for (int i = 0; i < a; i++) {
map.put(key, Integer.parseInt(br.readLine()));
key++;
}
문제에서 제공되는 입력의 방식에는 알파벳이 A부터 Z까지 한정되어있다.
그리고 알파벳은 순서대로 A부터 Z까지 차례대로 올라가니
반복문을 이용해 A부터 입력한 숫자를 순서대로 매칭시켜 주었다.
2. 연산자에 맞는 기능들을 부여하기
private static double calculate(Double num1, Double num2, char c) {
switch (c) {
case '+':
return num2 + num1;
case '-':
return num2 - num1;
case '*':
return num2 * num1;
case '/':
return num2 / num1;
default :
return 0;
}
}
따로 메소드를 만들어 기능을 수행시키고자 했다.
이때 연산식은 num1 + num2 가아닌 num2 + num1 로 각 위치를 뒤집었는데 이유는
알파벳에 값들을 매칭시키고 이를 스택을 이용하여 계산하기 때문에 값의 순서가 뒤집혀 나오기 때문이다.
예를들어 ABC*+DE/- 인경우
정규식으로 풀어낸다면 A+B*C-D/E 가 되겠는데 나는 이 ABC*+DE/- 를 스택에 넣어서 각 조건마다 계산을 하기 때문에
스택에는
- |
/ |
E |
D |
+ |
* |
C |
B |
A |
이와같은 형태로 쌓이게 되겠고 -부터 A까지 차례대로 꺼내면서 계산하기에
실질적으로 계산되는 ABCDE (알파벳) 들은
EDCBA순으로 나오게 되겠다. 이를 만약 순서를 변경하지않고 계산하게된다면
D/E 가 아닌 E/D와 같은 문제가 발생하기 때문에 순서를 뒤집은 것.
3. 알파벳들에 매칭된 수들을 이용하여 계산값을 도출
for (char c : string.toCharArray()) {
if (Character.isAlphabetic(c)) { //탐색되고있는 문자c가 알파벳인경우
stack.push(Double.valueOf(map.get(c)));
} else {
double b = calculate(stack.pop(), stack.pop(), c);
stack.push(b);
}
}
System.out.format("%.2f",stack.pop());
char c : string.toCharArray() 는
문자열 string을 각 문자별로 쪼개어 배열에 담았을때
문자 하나하나인 c를 모두 탐색 할때까지를 말한다
입력받은 문자열중 알파벳일 경우 그 알파벳과 매칭되는 값을 스택에 넣어주고
만일 연산자 일경우 스택에서 두 수를 뽑아 해당 연산자의 기능을 연결 시켜주어 계산후 스택에 넣어준다
이후 결과값은 0.00 과같은 실수타입을 원하기에 마지막 결과값인 스택의 최상단 부분을 format으로 지정해주었다.
코드전문
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class training {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(br.readLine());
Map<Character, Integer> map = new HashMap<>();
Stack<Double> stack = new Stack<>();
String string = br.readLine();
//입력받는 알파벳들 A to Z 에 입력받는 수를 매칭시켜줌
char key = 'A';
for (int i = 0; i < a; i++) {
map.put(key, Integer.parseInt(br.readLine()));
key++;
}
for (char c : string.toCharArray()) {
if (Character.isAlphabetic(c)) {
stack.push(Double.valueOf(map.get(c)));
} else {
double b = calculate(stack.pop(), stack.pop(), c);
stack.push(b);
}
}
System.out.format("%.2f",stack.pop());
}
private static double calculate(Double num1, Double num2, char c) {
switch (c) {
case '+':
return num2 + num1;
case '-':
return num2 - num1;
case '*':
return num2 * num1;
case '/':
return num2 / num1;
default :
return 0;
}
}
}
결과
'백준 알고리즘' 카테고리의 다른 글
18. 10808번 알파벳 개수 (0) | 2021.09.22 |
---|---|
17. 1918번 후위표기식 (1) | 2021.09.22 |
15. 17299번 오등큰수 (0) | 2021.09.22 |
14. 17298번 오큰수 (0) | 2021.09.13 |
13. 10799번 쇠막대기 (0) | 2021.09.13 |