알고리즘/백준
[BoJ] - 2504번 괄호의 값
cafe-jun12
2025. 5. 29. 19:47
반응형

입력
- 괄호열을 나타내는 문자열이 한 줄로 주어진다.
- 문자열 길이: 1 이상, 30 이하
- 문자열은 '(', ')', '[', ']'로만 구성됨
출력
- 주어진 괄호열이 올바른 괄호열이라면 계산된 정수 값을 출력
- 올바르지 않은 괄호열이라면 0 출력
해결 아이디어
- 열린 괄호 (, [ 는 스택에 push
- 닫힌 괄호 ), ] 가 나오면:
- 스택에서 열린 괄호 또는 중간 숫자들을 꺼내며 계산
- 올바른 짝인지 확인하고, 중간 값을 2 또는 3 곱하여 다시 스택에 push
- 괄호열이 끝나고 스택에 정수만 남았다면, 모두 더해서 결과 반환
- 중간에 잘못된 구조 발견 시 즉시 0 출력
다음 조건 중 하나라도 해당되면 0을 출력합니다.
- 열린 괄호 없이 닫힌 괄호가 나올 때
- 괄호쌍이 서로 맞지 않을 때 (( ] 또는 [ ))
- 문자열 처리 후 스택에 괄호가 남아 있을 때
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
Stack<Object> stack = new Stack<>();
for (char c : line.toCharArray()) {
if (c == '(' || c == '[') {
stack.push(c); // 열린 괄호 push
} else {
int value = 0;
while (!stack.isEmpty() && stack.peek() instanceof Integer) {
value += (Integer) stack.pop(); // 내부 숫자 누적
}
if (stack.isEmpty()) {
System.out.println(0);
return;
}
char open = (char) stack.pop();
if ((c == ')' && open != '(') || (c == ']' && open != '[')) {
System.out.println(0);
return;
}
// 기본값 or 내부 값 곱셈 적용
if (c == ')') {
stack.push(value == 0 ? 2 : 2 * value);
} else {
stack.push(value == 0 ? 3 : 3 * value);
}
}
}
int result = 0;
for (Object obj : stack) {
if (obj instanceof Character) {
System.out.println(0);
return;
}
result += (Integer) obj;
}
System.out.println(result);
}
}
반응형