All :L

[BOJ/Java] 괄호의 값 (2504) 본문

CODING/BOJ

[BOJ/Java] 괄호의 값 (2504)

ofijwe 2024. 8. 26. 23:04
반응형

괄호의 값 (2504)

1. 문제 분석

문제 개요

  • 주어진 문자열에서 괄호의 짝을 맞추고, 괄호가 짝이 맞을 때 각각의 괄호에 대해 특정 값을 계산하는 문제이다.
  • 괄호가 올바르게 쌍을 이루어야 하며, 계산된 값은 괄호의 짝을 이루는 방식에 따라 다르다.

입력 형식

  • 한 줄에 괄호로 구성된 문자열이 주어진다.

출력 형식

  • 괄호가 올바르게 짝을 이루면 계산된 값을 출력하고, 그렇지 않으면 0을 출력한다.

2. 알고리즘 종류

이 문제는 스택을 이용한 괄호의 짝 맞추기와 계산 문제이다. 스택을 사용하여 괄호를 처리하고, 괄호의 짝에 따라 값을 계산한다.

3. 주요 부분 및 코드 작성 방법

1. 스택 사용 및 괄호 처리

  • 여는 괄호는 스택에 추가하고, 닫는 괄호는 스택에서 짝을 맞추어 제거한다.
  • 괄호 쌍에 대한 계산은 현재 스택의 상태와 괄호의 종류에 따라 다르다.

2. 현재 괄호와 스택의 상태 비교

  • 닫는 괄호가 나오면, 스택의 최상단과 비교하여 올바른 쌍인지 확인한다.
  • 올바른 쌍이라면 계산을 수행하고, 아니라면 오류를 표시한다.

4. 코드 설명

메인 함수 (main)

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 입력을 받기 위한 BufferedReader 객체 생성
        String line = br.readLine(); // 괄호로 구성된 문자열을 입력받음

        Stack<Character> st = new Stack<>(); // 문자형 스택 생성
        boolean flag = true; // 괄호 쌍의 유효성을 체크하는 플래그
        int answer = 0; // 최종 계산 결과
        int cnt = 1; // 현재 괄호 쌍의 계산 값

        for (int i = 0; i < line.length(); i++) { // 문자열의 각 문자에 대해 반복
            char cur = line.charAt(i); // 현재 문자를 가져옴

            if (cur == '(') { // 여는 괄호일 경우
                st.push(cur); // 스택에 여는 괄호 추가
                cnt *= 2; // 여는 괄호의 계산 값 증가
            } else if (cur == '[') { // 여는 대괄호일 경우
                st.push(cur); // 스택에 여는 대괄호 추가
                cnt *= 3; // 여는 대괄호의 계산 값 증가
            } else { // 닫는 괄호일 경우
                if (cur == ')') { // 닫는 괄호가 ')'일 경우
                    if (st.isEmpty() || st.peek() != '(') { // 스택이 비어있거나 최상단이 '('가 아닐 경우
                        flag = false; // 유효하지 않음
                        break;
                    }
                    if (line.charAt(i - 1) == '(') { // 바로 앞 문자가 '('일 경우
                        answer += cnt; // 계산 값 더하기
                    }
                    st.pop(); // 스택에서 '(' 제거
                    cnt /= 2; // 계산 값 감소
                } else if (cur == ']') { // 닫는 대괄호가 ']'일 경우
                    if (st.isEmpty() || st.peek() != '[') { // 스택이 비어있거나 최상단이 '['가 아닐 경우
                        flag = false; // 유효하지 않음
                        break;
                    }
                    if (line.charAt(i - 1) == '[') { // 바로 앞 문자가 '['일 경우
                        answer += cnt; // 계산 값 더하기
                    }
                    st.pop(); // 스택에서 '[' 제거
                    cnt /= 3; // 계산 값 감소
                } else { // 올바르지 않은 문자일 경우
                    flag = false; // 유효하지 않음
                    break;
                }
            }
        }

        if (!flag || !st.isEmpty()) { // 괄호의 짝이 맞지 않거나 스택이 비어있지 않은 경우
            System.out.println(0); // 결과로 0 출력
        } else {
            System.out.println(answer); // 계산된 결과 출력
        }
    }
}

5. 전체 코드

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 입력을 받기 위한 BufferedReader 객체 생성
        String line = br.readLine(); // 괄호로 구성된 문자열을 입력받음

        Stack<Character> st = new Stack<>(); // 문자형 스택 생성
        boolean flag = true; // 괄호 쌍의 유효성을 체크하는 플래그
        int answer = 0; // 최종 계산 결과
        int cnt = 1; // 현재 괄호 쌍의 계산 값

        for (int i = 0; i < line.length(); i++) { // 문자열의 각 문자에 대해 반복
            char cur = line.charAt(i); // 현재 문자를 가져옴

            if (cur == '(') { // 여는 괄호일 경우
                st.push(cur); // 스택에 여는 괄호 추가
                cnt *= 2; // 여는 괄호의 계산 값 증가
            } else if (cur == '[') { // 여는 대괄호일 경우
                st.push(cur); // 스택에 여는 대괄호 추가
                cnt *= 3; // 여는 대괄호의 계산 값 증가
            } else { // 닫는 괄호일 경우
                if (cur == ')') { // 닫는 괄호가 ')'일 경우
                    if (st.isEmpty() || st.peek() != '(') { // 스택이 비어있거나 최상단이 '('가 아닐 경우
                        flag = false; // 유효하지 않음
                        break;
                    }
                    if (line.charAt(i - 1) == '(') { // 바로 앞 문자가 '('일 경우
                        answer += cnt; // 계산 값 더하기
                    }
                    st.pop(); // 스택에서 '(' 제거
                    cnt /= 2; // 계산 값 감소
                } else if (cur == ']') { // 닫는 대괄호가 ']'일 경우
                    if (st.isEmpty() || st.peek() != '[') { // 스택이 비어있거나 최상단이 '['가 아닐 경우
                        flag = false; // 유효하지 않음
                        break;
                    }
                    if (line.charAt(i - 1) == '[') { // 바로 앞 문자가 '['일 경우
                        answer += cnt; // 계산 값 더하기
                    }
                    st.pop(); // 스택에서 '[' 제거
                    cnt /= 3; // 계산 값 감소
                } else { // 올바르지 않은 문자일 경우
                    flag = false; // 유효하지 않음
                    break;
                }
            }
        }

        if (!flag || !st.isEmpty()) { // 괄호의 짝이 맞지 않거나 스택이 비어있지 않은 경우
            System.out.println(0); // 결과로 0 출력
        } else {
            System.out.println(answer); // 계산된 결과 출력
        }
    }
}
반응형

'CODING > BOJ' 카테고리의 다른 글

[BOJ/Java] 달력 (20207)  (0) 2024.08.28
[BOJ/Java] 스택 수열 (1874)  (0) 2024.08.27
[BOJ/Java] 괄호 (9012)  (0) 2024.08.26
[BOJ/Java] 스택 (10828)  (0) 2024.08.26
[BOJ/Java] 알파벳 (1987)  (0) 2024.08.26
Comments