프로그래머스 - 올바른 괄호

윤민선·2026년 8월 7일

프로그래머스

목록 보기
63/73
post-thumbnail

문제 설명

문자열 s가 올바른 괄호로 이루어져 있으면 true, 그렇지 않으면 false를 반환하는 문제이다.

"(())()" → true
")(" → false
"(((" → false

접근 방법

스택(Stack) 자료구조를 사용하였다.

상황처리
여는 문자 등장push
닫는 문자 등장스택이 비어있으면 false, 아니면 pop
순회 완료스택이 비어있으면 true, 남아있으면 false
  • ( 를 만나면 스택에 push
  • ) 를 만나면 스택에서 pop (짝이 맞는 (를 제거)
  • ) 를 만났는데 스택이 비어있으면 → 짝이 없는 )false
  • 모두 순회한 뒤 스택이 비어있으면 → 모든 괄호가 짝이 맞음 → true
  • 스택에 남아있으면 → 닫히지 않은 (가 있음 → false

예시로 확인하면 아래와 같다.

s = "(())()"

'(' → push    스택: ['(']
'(' → push    스택: ['(', '(']
')' → pop     스택: ['(']
')' → pop     스택: []
'(' → push    스택: ['(']
')' → pop     스택: []

순회 완료 → 스택 비어있음 → true ✅
s = ")("

')' → 스택 비어있음 → false ✅

마지막 반환 부분은 stack.isEmpty()가 이미 true/false를 반환하므로 if-else 없이 바로 반환할 수 있다.

// if-else 대신
return stack.isEmpty();

구체적으로 정리한 풀이 흐름:

  1. 빈 스택 생성
  2. 문자열을 앞에서부터 순회
  3. (이면 스택에 push
  4. )이면 스택이 비어있으면 false, 아니면 pop
  5. 순회 완료 후 stack.isEmpty() 반환

최종 코드

import java.util.Stack;

class Solution {
    boolean solution(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 (c == ')') {
                if (stack.isEmpty()) {
                    return false;
                }
                stack.pop();
            }
        }

        return stack.isEmpty();
    }
}

실행 결과

0개의 댓글