백준 문제 풀이/백준 (JAVA)
JAVA 백준 2504 괄호의 값 (스택)
gamja00
2025. 6. 17. 15:30

https://www.acmicpc.net/problem/2504
문제
- 첫째 줄에 괄호열이 있는 문자열 ( 1 <= 문자열의 길이 <= 30 ) 이 주어진다.
-
- ‘()’ 인 괄호열의 값은 2이다.
- ‘[]’ 인 괄호열의 값은 3이다.
- ‘(X)’ 의 괄호값은 2×값(X) 으로 계산된다.
- ‘[X]’ 의 괄호값은 3×값(X) 으로 계산된다.
- 올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X) + 값(Y) 로 계산된다.
- 괄호를 계산한 값을 정수로 출력한다. 올바르지 못한 괄호열일 경우 0을 출력한다.
정답 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] list = br.readLine().split("");
Stack<String> stack = new Stack<>();
int result = 0;
for (int i = 0; i < list.length; i++) {
int temp = 0;
if (Objects.equals(list[i], "(") || Objects.equals(list[i], "[")) {
stack.push(list[i]);
} else {
while (!stack.isEmpty() && !Objects.equals(stack.peek(), "(") && !Objects.equals(stack.peek(), "[")) {
temp += Integer.parseInt(stack.pop());
}
if (!stack.isEmpty()) {
if (Objects.equals(stack.peek(), "(") && Objects.equals(list[i], ")")) {
stack.pop();
if (temp == 0) {
stack.push("2");
} else {
stack.push(String.valueOf(temp * 2));
}
} else if (Objects.equals(stack.peek(), "[") && Objects.equals(list[i], "]")) {
stack.pop();
if (temp == 0) {
stack.push("3");
} else {
stack.push(String.valueOf(temp * 3));
}
} else {
System.out.println(0);
return;
}
}else{
System.out.println(0);
return;
}
}
if (i == list.length - 1) {
while (!stack.isEmpty()) {
String s = stack.pop();
if (Objects.equals(s, "(") || Objects.equals(s, "[")) {
System.out.println(0);
return;
}
result += Integer.parseInt(s);
}
}
}
System.out.println(result);
}
}
Stack에 여는 괄호만 넣으며 닫는 괄호가 들어오면 계산을 시작한다.
스택에는 여는 괄호와 계산된 값들을 넣는데 스택의 맨 위에서부터 값을 꺼내며 여는 괄호가 나올 때까지의 수를 합하고 닫히는 괄호와 여는 괄호의 쌍이 맞을 때 정해진 값을 곱해주고 다시 스택에 넣는다.
여기서 계산은 문제 없이 되는데 괄호의 쌍이 모두 맞는지 확인을 계속 하도록 해주어야 된다.
testcaseAC에 해당 문제가 있으나 모든 테스트 케이스를 통과해도 문제가 틀리는 일이 생겼다.
90퍼센트 부근에서 문제를 틀렸는데 같은 사람들이 있다면 https://www.acmicpc.net/board/view/137445
이 케이스를 확인해보길 바란다.