[문제] BOJ 2504. 괄호의 값
문제 링크 :
https://www.acmicpc.net/problem/2504
i 0 1 2 3 4 5 arr[i] [ [ [ ] ] ] multiplier 3 9 27 9 3 1
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public int solution(String str) {
int answer = 0;
int multiplier = 1;
Stack<Character> stack = new Stack<>();
int length = str.length();
// 분배 법칙을 생각하자!
loop:
for (int i = 0; i < length; i++) {
switch (str.charAt(i)) {
case '(':
stack.push(str.charAt(i));
multiplier *= 2;
break;
case ')':
if (stack.isEmpty() || stack.peek() != '(') {
answer = 0;
break loop;
}
if (str.charAt(i - 1) == '(') {
answer += multiplier;
}
stack.pop();
multiplier /= 2;
break;
case '[':
stack.push(str.charAt(i));
multiplier *= 3;
break;
case ']':
if (stack.isEmpty() || stack.peek() != '[') {
answer = 0;
break loop;
}
if (str.charAt(i - 1) == '[') {
answer += multiplier;
}
stack.pop();
multiplier /= 3;
break;
}
}
if (stack.isEmpty()) {
answer = 0;
}
return answer;
}
public static void main(String[] args) throws IOException {
Main main = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
System.out.println(main.solution(str));
}
}
골드 5 문제인데 골드 1 정도는 되어야 하지 않을까 하는 생각이 들 정ㄷ로 충격받은 문제다. 이런 문제가 코테에 나오면 끔찍할 것 같다. 생각하는데 너무 시간이 오래 걸
렸고, 한번만에 풀지 못해서 인터넷에 찾았다. 그리고 그걸 이해하는데도 시간이 오래 걸렸다ㅠㅠ
분기가 많으니까 올바른 괄호열인지 잘 확인해야 하고, multiplier가 더해지는 순간과 아닌 순간을 잘 나누어야 한다.
이걸 이해 못해서 무려..3시간이나 썼다. 부끄럽지만, 이해했으니까 다음에 비슷한 문제가 나오면 이렇게 접근해서 풀어봐야겠다.
참고로 다른 문제 풀이들을 보면 for문을 빠져나오도록 레이블을 달고 조건을 미충족하면 바로 탈출하도록 하지 않아서 채점하면 틀린 것으로 나온다. 이건 한 유저가 반례인 ()]()를 제시했기 때문에 데이터셋이 추가되었기 때문이다.
그래서 위의 코드로 푸는 것을 추천한다!