[백준][Java] 9012_괄호

김피자·2024년 12월 30일

알고리즘

목록 보기
5/5

문제 링크

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int testCase = sc.nextInt(); // 테스트 케이스
        
        for (int i = 0; i < testCase; i++) {
            String s = sc.next(); // 입력 문자열
            if (s.length() >= 2 && s.length() <= 50) {
                System.out.println(solve(s)); // solve 호출
            } else {
                System.out.println("NO"); // 조건에 맞지 않는 경우 NO 출력
            }
        }
    }
    
    public static String solve(String s) {
        Stack<Character> stack = new Stack<>();
        
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            
            if (c == '(') {
                stack.push(c);
            } else if (stack.isEmpty()) { // 스택이 비었을 경우
                return "NO";
            } else {
                stack.pop();
            }
        }
        
        return stack.isEmpty() ? "YES" : "NO"; // 스택이 비었으면 YES, 아니면 NO
    }
}

스택을 사용한 풀이

  1. 스택 생성: 열린 괄호 '('를 스택에 추가(push)
  2. 문자열 순회:
    '(': 스택에 push.
    ): 스택이 비어 있으면 VPS가 아님 → "NO".
    ): 스택에서 pop(짝이 맞는 열린 괄호 제거).
  3. 최종 :
    문자열 순회 후 스택이 비어 있으면 VPS → "YES".
    스택에 남아 있는 괄호가 있으면 VPS가 아님 → "NO"

후기 : 간단하게 count하는 방법도 좋을 것 같다
변수 하나를 만들어두고 charAt(i)가 '('일 경우 +1 ')'일 경우 -1하여
마지막 count가 0이면 YES, 0이 아니면 NO

profile
제로부터시작하는코딩생활

0개의 댓글