
-Code
import java.io.*;
import java.util.*;
public class BOJ26577 {
// 우선 순위 확인을 위한 맵
static Map<String, Integer> calcVal = Map.of(
"+", 1,
"-", 1,
"*", 2,
"/", 2,
"%", 2
);
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
int dataCnt = Integer.parseInt(br.readLine());
for (int data = 0; data < dataCnt; data++) {
StringTokenizer st = new StringTokenizer(br.readLine());
// 입력에 따른 후위 표현식으로 변환
Deque<String> calc = new ArrayDeque<>();
Deque<String> convert = new ArrayDeque<>();
while (st.hasMoreTokens()) {
String token = st.nextToken();
// 숫자인 경우는 그냥 추가
if (!"+-*/%".contains(token)) {
convert.addLast(token);
} else {
// 우선 순위에 따른 저장 및 계산식 덱에 저장
while (!calc.isEmpty()) {
String nowTop = calc.peekLast();
if (calcVal.get(nowTop) < calcVal.get(token)) {
break;
}
convert.addLast(calc.pollLast());
}
calc.addLast(token);
}
}
// 나머지 연산 추가
while (!calc.isEmpty()) {
convert.addLast(calc.pollLast());
}
// 후위 표현식 계산
Deque<Integer> result = new ArrayDeque<>();
while (!convert.isEmpty()) {
// 앞의 값을 확인
String val = convert.pollFirst();
if (!"+-*/%".contains(val)) {
// 숫자라면 저장
result.addLast(Integer.parseInt(val));
} else {
// 연산자면 계산
int n2 = result.pollLast();
int n1 = result.pollLast();
// 연산자에 따른 2개의 숫자 계산
int calcRes = 0;
switch (val) {
case "+": calcRes = n1 + n2; break;
case "-": calcRes = n1 - n2; break;
case "%": calcRes = n1 % n2; break;
case "/": calcRes = n1 / n2; break;
case "*": calcRes = n1 * n2; break;
}
result.addLast(calcRes);
}
}
System.out.println(result.pollLast());
}
br.close();
}
}
처음에 token에 첫 값이 숫자인 경우에 계산을 해 예제 입출력이 맞아 제출했으나 null pointer오류가 생겨서 찾아보니 음수가 나올 수 있기 때문 임을 알게 연산에 포함되는지로 해결했습니다.
'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글
| [백준/Java] 2304번 창고 다각형 (0) | 2026.03.06 |
|---|---|
| [백준/Java] 1522번 문자열 교환 (0) | 2026.03.05 |
| [백준/Java] 1138번 한 줄로 서기 (0) | 2026.03.05 |
| [백준/Java] 35277번 유림이와 하람이의 두쫀쿠 대작전 (0) | 2026.03.04 |
| [백준/Java] 11501번 주식 (0) | 2026.03.03 |