
내가 생각했을때 문제에서 원하는부분
첫째 줄에 괄호열을 나타내는 문자열(스트링)이 주어진다.
단 그 길이는 1 이상, 30 이하이다.
첫째 줄에 그 괄호열의 값을 나타내는 정수를 출력한다.
만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다.
내가 이 문제를 보고 생각해본 부분
입력받은 괄호 문자열을 한 문자씩 순회한다.
열린 괄호 '(' 일 때는 스택에 '('를 넣고 현재 곱셈 값 cur을 2배로 늘린다.
열린 괄호 '[' 일 때는 스택에 '['를 넣고 cur을 3배로 늘린다.
닫힌 괄호 ')' 는 스택이 비어 있거나 맨 위에 '(' 가 없으면 올바르지 않은 괄호열이므로 0을 출력하고 종료한다.
바로 이전 문자가 '(' 였다면, 현재 곱셈 값 cur을 결과값 res에 더한다.
스택에서 '('를 꺼내고, cur 값을 2로 나눈다.
닫힌 괄호 ']' 는 스택이 비어 있거나 맨 위에 '[' 가 없으면 올바르지 않은 괄호열이므로 0 출력 후 종료한다.
바로 이전 문자가 '[' 였다면, 현재 cur을 결과 res에 더한다.
스택에서 '['를 꺼내고, cur 값을 3으로 나눈다.
반복문 종료 후 스택이 비어 있으면 누적된 결과 res를 출력하고, 아니면 0 출력하여 올바른 괄호열인지 판별한다.
코드로 구현
package baekjoon.baekjoon_33;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
// 백준 2504번 문제
public class Main1330 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
Stack<Character> stack = new Stack<>();
int cur = 1;
int res = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '(':
stack.push('(');
cur *= 2;
break;
case '[':
stack.push('[');
cur *= 3;
break;
case ')':
if (stack.isEmpty() || stack.peek() != '(') {
System.out.println(0);
return;
}
if (i > 0 && s.charAt(i - 1) == '(') {
res += cur;
}
stack.pop();
cur /= 2;
break;
case ']':
if (stack.isEmpty() || stack.peek() != '[') {
System.out.println(0);
return;
}
if (i > 0 && s.charAt(i - 1) == '[') {
res += cur;
}
stack.pop();
cur /= 3;
break;
}
}
System.out.println(stack.isEmpty() ? res : 0);
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.