728x90

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

 

2504번: 괄호의 값

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일 X

www.acmicpc.net

 

 

 

풀이)

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

public class Main_BJ_2504_괄호의값 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        Stack<Character> stack = new Stack<>();
        int sum = 0;
        int temp = 1;
        for(int i=0; i<str.length(); i++){
            char c = str.charAt(i);
            if(c == '(') {
                stack.push(c);
                temp *= 2;
            }
            else if(c == '['){
                stack.push(c);
                temp *= 3;
            }
            else if(c == ')'){
                if(stack.isEmpty() || stack.peek()!='('){
                    sum = 0;
                    break;
                }
                if(str.charAt(i-1) == '(')
                    sum += temp;

                temp /= 2;
                stack.pop();

            }
            else{
                if(stack.isEmpty() || stack.peek()!='['){
                    sum = 0;
                    break;
                }
                if(str.charAt(i-1) == '[')
                    sum += temp;

                temp /= 3;
                stack.pop();
            }
        }//for
        if(stack.isEmpty())
            System.out.println(sum);
        else System.out.println(0); //stack에 괄호가 존재할경우 짝이 안 맞음
    }//main
}

괄호 짝 맞추기는 했는데 계산하는게 꼬여서 틀렸던 문제다.

 

먼저, 짝이 맞는 케이스만 생각해보면,,

'('가 들어온다면 temp*=2, '['가 들어온다면 temp*=3을 해준다.

그 후, ')' 이나 ']' 을 만났을 때 전체 값에 temp를 올려서 더해주면 된다.

그리고 ')'이면 /2, ']'이면 /3을 하면 된다.

 

이때, 주의할 점은 연속된 여는 괄호가 있을 때다. => ([[]]) 와 같은 경우!!

나누기를 계속 해줘야지 중복으로 더하는 것을 방지할 수 있다.

이를 확인하는 방법은 닫힌 괄호가 나올 때마다 그 앞의 괄호와 짝이 맞는지를 확인하면 된다.

짝이 맞는다면 전체 값에 올려주는 과정을 진행하면 되고, 안 맞는다면 나누기만 반복하면 된다.

 

그리고 예외 케이스로, 짝이 안 맞을 땐 두 가지로 확인할 수 있다.

1. 열린 괄호와 닫힌 괄호가 짝이 안 맞을 때

2. 열린 괄호의 개수가 닫힌 괄호의 개수보다 많아서 짝이 안 맞을 때

 

1번의 경우 코드에서 닫힌 괄호가 나왔을 때, 스택이 비었거나(짝이 없음) 짝이 안 맞을 경우 바로 전체 값을 0으로 만들어 주었다.

2번의 경우 for문을 다 나와서 stack에 값이 존재하는지를 확인하여 케이스를 처리해주었다.

728x90

'코테 > 백준' 카테고리의 다른 글

백준 14916 거스름돈(JAVA)  (0) 2023.06.19
백준 5014 스타트링크(JAVA)  (0) 2023.06.15
백준 1316 그룹 단어 체커(JAVA)  (0) 2023.06.14
백준 1713 후보 추천하기(JAVA)  (0) 2023.06.05
백준 7562 나이트의 이동(JAVA)  (0) 2023.06.04

+ Recent posts