백준 2504 괄호의 값 (Java,자바)

jonghyukLee·2022년 2월 3일
0

이번에 풀어본 문제는
백준 2504번 괄호의 값 입니다.

📕 문제 링크

❗️코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        char[] map = input.toCharArray();
        Stack<Character> stk = new Stack<>();

        int size = map.length;
        int answer = 0;
        int tmp = 1;
        if(map[0] == ')' || map[0] == ']') exit();
        for (int i = 0; i < size; ++i)
        {
            char c = map[i];
            if(c == '(' || c == '[')
            {
                int n = c == '(' ? 2 : 3;
                stk.push(c);
                tmp *= n;
            }
            else if (c == ')')
            {
                if(stk.isEmpty() || stk.peek() != '(') exit();
                if(map[i-1] == '(') answer += tmp;
                stk.pop();
                tmp /= 2;
            }
            else if(c == ']')
            {
                if(stk.isEmpty() || stk.peek() != '[') exit();
                if(map[i-1] == '[') answer += tmp;
                stk.pop();
                tmp /= 3;
            }
            else exit();
        }
        if(!stk.isEmpty()) answer = 0;
        System.out.println(answer);
    }
    static void exit()
    {
        System.out.println("0");
        System.exit(0);
    }
}

📝 풀이

두 괄호("()","[]") 로 이루어진 문자열에서, 주어진 규칙에 맞게 괄호를 계산하여 값을 출력하는 문제입니다. 올바르지 않은 입력이 주어졌을 때는 0을 출력합니다.
여는 괄호의 경우 종류에 맞게 tmp에 2또는 3의 값을 곱해주어 값을 누적해주고, 닫는 괄호는 앞전에 같은 괄호가 열려있는 경우에만 쌓인 값을 더해줍니다. 닫는 연산을 마치면 항상 값을 나누고, 스택을 비워줘서 이미 계산한 값을 제외해 주어야 합니다. 분배법칙을 생각하며 이해하니 조금 이해가 됐던것 같습니다.

📜 후기

많이 어려운 문제였습니다. 곱셈과 덧셈 연산을 구분해주며 괄호의 묶음이 일정하지 않았기 때문에 해결하기 쉽지 않았습니다. 다른 풀이들을 참고하여 풀었습니다.

profile
머무르지 않기!

0개의 댓글