[JAVA/2504번] 괄호의 값

고지훈·2021년 10월 26일
1

Algorithm

목록 보기
44/68
post-thumbnail

문제


입력 및 출력


풀이

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

class Main {
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 입력받은 문자열을 쪼갠다.
        char[] charArray = br.readLine().toCharArray();

        // 후입선출 자료구조 스택 선언
        Stack < Character > stack = new Stack < > ();

        // 괄호 닫힘 상태를 알 수 있는 변수
        boolean isVPS = false;

        // 결과 값을 위한 변수, 계산을 위한 변수
        int answer = 0;
        int value = 1;

        // 배열의 길이만큼 반복문을 수행한다.
        for (int i = 0; i < charArray.length; i++) {
            // '('모양의 괄호일 경우, value변수에 2를 곱해준다.
            if (charArray[i] == '(') {
                stack.push(charArray[i]);
                value *= 2;
            }
            // '['모양의 괄호일 경우, value변수에 3를 곱해준다.
            if (charArray[i] == '[') {
                stack.push(charArray[i]);
                value *= 3;
            }

            // ')'모양의 괄호일 경우, 스택이 비어있거나 스택의 제일 위에 있는 요소가 '('가 아닐 경우	  
            if (charArray[i] == ')') {
                if (stack.isEmpty() || stack.peek() != '(') {
                    isVPS = true;
                    break;
                }
                // 직전의 요소가 '('인 경우
                if (charArray[i - 1] == '(') {
                    // 현재까지 곱해진 값을 더한다.
                    answer += value;
                }
                stack.pop();
                // 쌍을 만났기 때문에 나누기 2를 해준다.
                value /= 2;
            } else if (charArray[i] == ']') {
                if (stack.isEmpty() || stack.peek() != '[') {
                    isVPS = true;
                    break;
                }
                if (charArray[i - 1] == '[') {
                    answer += value;
                }
                stack.pop();
                value /= 3;
            }
        }

        // 스택이 비어있지 않은 경우
        if (isVPS || stack.isEmpty() == false) {
            System.out.println(0);
        } else {
            System.out.println(answer);
        }
    }
}

결과 및 해결방법

[결과]

[정리]

해결방법
이전에 괄호 문제를 풀어봤다면 쉽게 해결할 수 있는 문제였다.

괄호 문제는 모든 괄호가 닫힌지 안닫힌지에 대한 여부만 판단하였다면, 이번 문제는 괄호에 대한 계산과 닫힘 여부도 판단하여야했다. 문제에서 가장 중요하게 생각했던 부분은 괄호의 쌍을 만나게 될 경우 해당 괄호가 갖는 고유의 값을 나눠주어야 하는 부분이였다.

이외에는 코드를 차례대로 읽어보면 이해하기 쉬울 것 같다!

profile
"계획에 따르기보다 변화에 대응하기를"

0개의 댓글