솜이의 데브로그

백준 24552번 ) 올바른 괄호 (java) 본문

Algorithm/백준

백준 24552번 ) 올바른 괄호 (java)

somsoming 2022. 3. 17. 18:28

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

 

24552번: 올바른 괄호

첫번째 줄에 문자열 $S$가 공백 없이 주어진다. ($3 \leq \vert S \vert \leq 100\,000$, $\vert S \vert$는 홀수이다.) 답은 $1$ 이상이다. 즉, 지웠을 때 올바른 괄호열이 되는 문자가 적어도 하나 존재한다.

www.acmicpc.net

 

문제

 

풀이

누적합으로 푸는 문제라고 하는데, 나는 배열로 저장하지는 않고 int 에서 +, -로 풀었다.

먼저 입력받은 문자열에서 총 여는 괄호와 닫는 괄호의 개수를 확인한다.

둘 중 어떤 괄호의 개수가 더 많은지 확인 후, ( 괄호의 개수가 많을 경우 왼쪽에서부터 확인하면서 올바른 괄호가 완성된 이후부터 ( 개수를 count 해서 출력한다.

) 괄호의 개수가 많은 경우, 반대로 오른쪽부터 확인하면서 올바른 괄호가 완성된 이후부터 ) 의 개수를 count 한다. (이 중 어느 괄호를 삭제해도 올바른 괄호가 완성되기 때문!)

 

 

코드

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        int left=0, right=0, sum=0;

        for(int i=0; i<s.length(); i++){
            if(s.charAt(i) == '('){
                left++;
            } else{
                right++;
            }
        }

        if(left>right){
            left = 0;
            right = 0;
            for(int i=0; i<s.length(); i++){
                if(s.charAt(i) == '(') left++;
                else right++;
                if(left == right){
                    left = 0;
                    right = 0;
                }
            }
            System.out.println(left);
        }
        else {
            left = 0;
            right = 0;
            for(int i= s.length()-1; i>=0; i--){
                if(s.charAt(i) == '(') left++;
                else right++;
                if(left == right){
                    left = 0;
                    right = 0;
                }
            }
            System.out.println(right);
        }
    }
}

 

 

풀면서 생각보다 단순한 문제이나, 어떤 방식으로 사고해서 풀어야하는지 찬찬히 생각해야함이 어려웠다.

특히 ')' 괄호의 경우 오른쪽부터 확인해야함을 잘 알아두자! (왼쪽부터 카운트하면 올바른 괄호로 잘못 카운트할 수 있음.)