Post

[JAVA]백준 2504번 괄호의 값

[JAVA]백준 2504번 괄호의 값

📌문제 링크


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

스크린샷 2025-01-14 오후 6 33 52

📌문제 설명


스택 문제로 잘 알려져있는 괄호 판별 문제입니다. 예외 처리와 맨 안쪽 괄호열 판별만 잘 하면 됩니다.

📌코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import java.io.*;
import java.util.Stack;

public class Main {
    static String str;
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static Boolean flag = true;
    static int answer = 0;

    public static void main(String[] args) throws IOException {
        input(); // 입력 받기
        solve(); // 문제 해결
        if (flag) {
            bw.write(answer + "\n"); // 결과 출력
        } else {
            bw.write("0\n"); // 잘못된 입력일 경우 0 출력
        }
        bw.flush(); // 버퍼 비우기
        bw.close(); // BufferedWriter 닫기
    }

    public static void input() throws IOException {
        str = br.readLine(); // 입력값 읽기
        br.close(); // BufferedReader 닫기
    }

    public static void solve() {
        Stack<Character> st = new Stack<>(); // 스택 생성
        int temp = 1; // 임시 변수 초기화
        for (int i = 0; i < str.length(); i++) {
            switch (str.charAt(i)) {
                case '(': // '('를 만났을 때
                    st.push('('); // 스택에 '(' 추가
                    temp *= 2; // temp 값을 2배로 증가
                    break;
                case '[': // '['를 만났을 때
                    st.push('['); // 스택에 '[' 추가
                    temp *= 3; // temp 값을 3배로 증가
                    break;
                case ')': // ')'를 만났을 때
                    if (st.isEmpty() || st.peek() != '(') { // 스택이 비어있거나 스택의 최상단이 '('가 아닐 때
                        flag = false; // 잘못된 입력으로 플래그 설정
                        return;
                    }
                    if (str.charAt(i - 1) == '(') { // 이전 문자가 '('일 때
                        answer += temp; // answer에 temp 값 추가
                    }
                    st.pop(); // 스택에서 '(' 제거
                    temp /= 2; // temp 값을 2로 나누기
                    break;
                case ']': // ']'를 만났을 때
                    if (st.isEmpty() || st.peek() != '[') { // 스택이 비어있거나 스택의 최상단이 '['가 아닐 때
                        flag = false; // 잘못된 입력으로 플래그 설정
                        return;
                    }
                    if (str.charAt(i - 1) == '[') { // 이전 문자가 '['일 때
                        answer += temp; // answer 에 temp 값 추가
                    }
                    st.pop(); // 스택에서 '[' 제거
                    temp /= 3; // temp 값을 3으로 나누기
                    break;
            }
        }
        if(!st.isEmpty()) { // 스택이 비어있지 않을 때
            flag = false; // 잘못된 입력으로 플래그 설정
        }
    }
}
This post is licensed under CC BY 4.0 by the author.