Algorithm/Java

[백준/JAVA] 괄호의 값

dbfl9911 2024. 10. 19. 15:42

https://www.acmicpc.net/problem/2504


- 문제 풀이

  1. ( 또는 [를 만났을 때 스택에 추가하고, 해당 값의 곱셈값을 temp에 반영합니다.
  2. ) 또는 ]를 만났을 때:
    • 스택이 비어 있거나, 올바르지 않은 괄호 구조가 되면 0을 출력하고 종료합니다.
    • 이전 문자가 열린 괄호 ( 또는 [일 때 answer에 temp 값을 누적합니다.
  3. 모든 괄호열이 끝난 후 스택에 남아 있는 괄호가 없으면 최종 answer 값을 출력합니다.

 

 

 

- 정답 코드

// https://www.acmicpc.net/problem/2504
package Data_Structure.괄호의값;

import java.io.*;
import java.util.*;

public class Main {
    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 answer = 0;
        int temp = 1;

        for(int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == '('){
                stack.push(s.charAt(i));
                temp *= 2;
            }else if(s.charAt(i) == '[') {
                stack.push(s.charAt(i));
                temp *= 3;
            }else if(s.charAt(i) == ')') {
                if(stack.isEmpty() || stack.peek() == '[' || stack.peek() == ']' ) {
                    System.out.println(0);
                    return;
                }
                if(s.charAt(i-1) == '(') {  // stack.peek()이 아니라 s.charAt(i-1)
                    answer += temp;
                }
                stack.pop();
                temp /= 2;  // temp값 초기화

            }else if(s.charAt(i) == ']') {
                if(stack.isEmpty() || stack.peek() == '(' || stack.peek() == ')') {
                    System.out.println(0);
                    return;
                }
                if(s.charAt(i-1) == '[') {  // stack.peek()이 아니라 s.charAt(i-1)
                    answer += temp;
                }
                stack.pop();
                temp /= 3; // temp값 초기화
            }
        }
        if(!stack.isEmpty()) {
            System.out.println(0);
        }else{
            System.out.println(answer);
        }
    }
}