[JAVA] 괄호

NoHae·2025년 4월 15일

백준

목록 보기
39/106

문제 출처

단계별로 풀어보기 > 스택 큐 덱 > 괄호
https://www.acmicpc.net/problem/9012

문제 설명

입력 데이터의 개수 N이 주어지고
임의의 괄호들로 이뤄진 문자열 N개가 주어질 때,
해당 문자열이 올바르게 괄호를 형성하고 있으면 YES, 아니면 NO를 출력하라.

접근 방법

0인 count를 지정하여 ')'가 오면 -1, '(' +1 한다.
여기서 count가 0보다 작아지는 순간 그 문자열은 올바르지 않은 괄호 문자열이다.

import java.io.*;

public class 괄호 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int count;

        int N = Integer.parseInt(br.readLine());
        for(int i = 0; i<N; i++){
            count = 0;
            String line = br.readLine();
            for(int j = 0; j<line.length(); j++){
                if(line.charAt(j) == ')'){
                    count--;
                    if(count < 0){
                        break;
                    }
                } else{
                    count++;
                }
            }
            if(count == 0) bw.write("YES"+"\n");
            else bw.write("NO" + "\n");

        }
        bw.flush();
        bw.close();
        br.close();
    }
}

Review

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

public class 괄호_review {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));



        int T = Integer.parseInt(br.readLine());


        for(int i = 0; i<T; i++){
            Stack<Character> stack = new Stack<>();
            String line = br.readLine();
            boolean result = true;
            for(int j = 0; j<line.length(); j++){
                if(line.charAt(j)== '('){
                    stack.push('(');
                }else{
                    if(stack.isEmpty()){
                        result = false;
                        break;
                    }
                    if(stack.pop() == ')'){
                        result = false;
                        break;
                    }
                }
            }
            if(!stack.isEmpty()) result = false;
            bw.write(result?"YES\n":"NO\n");
        }

        bw.flush();
        bw.close();
        br.close();
    }
}

알게된 점

프로그래머스에서 풀어본 문제라서 어렵진 않았다.
하지만, 스택으론 풀어보지 않고 항상 위의 방식대로만 풀었으므로 Review땐 스택으로 풀어봐야겠다.

Review
스택으로 풀어도 메모리랑 시간 결과가 비슷하게 나왔다.

문제푼 흔적


Review

profile
노력 해보려고 하는 사람(00년생 소프트웨어융합학과, 24년 12월 부터 백엔드 및 코테 공부 시작)

0개의 댓글