728x90
문제
() = 2, [] = 3 이고
(x) = 2 * x, [x] = 3 * x 일 때
괄호로만 이루어진 문자열의 계산 결과를 구하는 문제
(잘못된 괄호인 경우에는 무조건 0을 출력)
접근 방식
문제의 이해는 쉽지만 구현이 어려웠던 문제다.
(()[[]])([])
(
((
(()
(2
(2[
(2+[[
(2+[[]
(2+[3
(2+[3]
(2+9
(11
(11)
22
22+(
22+([
22+([]
22+(3
22+(3)
22+6
28
주어진 문자열에 대한 계산 순서는 위와 같은데
문제를 자세히 읽어 보면 잘못된 괄호의 경우에는 생각할 필요가 없고
제대로 된 괄호의 경우만 생각하면 된다.
즉, 모든 괄호가 알맞게 짝지어져 있다는 가정 하에 계산을 하면 되는데
() = 2니까 (()) = 2의 제곱, ((())) = 2의 3제곱이 되고,
[] = 3이니 [[]] = 3의 제곱, [[[]]] = 3의 3제곱이 된다.
소괄호가 들어오면 num에 2를 곱해주고 대괄호가 들어오면 3을 곱해준 다음에
괄호가 닫히면 더해주고 닫힌 괄호로 다시 나눠주면 된다.
풀이
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] input = br.readLine().toCharArray();
Stack<Character> stack = new Stack<>();
int sum = 0;
int num = 1;
for (int i = 0; i < input.length; i++) {
char c = input[i];
if (c == '(') {
stack.push(c);
num *= 2;
} else if (c == '[') {
stack.push(c);
num *= 3;
} else if (c == ')') {
if (stack.isEmpty() || stack.peek() != '(') {
System.out.println(0);
return;
}
stack.pop();
if (input[i - 1] == '(') {
sum += num;
}
num /= 2;
} else {
if (stack.isEmpty() || stack.peek() != '[') {
System.out.println(0);
return;
}
stack.pop();
if (input[i - 1] == '[') {
sum += num;
}
num /= 3;
}
}
if (stack.isEmpty()) {
System.out.println(sum);
} else {
System.out.println(0);
}
}
}
'Java > Algorithms' 카테고리의 다른 글
[BFS] 구현 및 팁 (1) | 2023.10.09 |
---|---|
[백준] 1926번 : 그림 (1) | 2023.10.09 |
[백준] 10799번 : 쇠막대기 (0) | 2023.10.07 |
[백준] 3986번 : 좋은 단어 (0) | 2023.10.07 |
[백준] 4949번 : 균형잡힌 세상 (0) | 2023.10.05 |