프로그래머스

[프로그래머스/JAVA]코딩테스트 연습 > 스택/큐 > 올바른 괄호

chani1352 2025. 3. 19. 14:40

[문제 설명]

더보기

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

입출력 예

입출력 예 설명

입출력 예 #1,2,3,4
문제의 예시와 같습니다.

[간단 설명]

'(', ')' 괄호의 열림 닫힘이 올바른 형태인지 true, false로 반환

 

[접근 방법]

  1. 스택/큐를 사용하기 위해 ArrayDeque 객체 생성 (ArrayDeque는 스택과 큐 모두를 효율적으로 지원하는 객체)
  2. for문을 활용해 괄호를 순차적으로 Deque의 끝에 저장
  3. Deque의 첫 번째가 ')' 닫힌 괄호인 경우 올바른 형태가 아니므로 false 반환
  4. 저장된 괄호가 ')' 닫힌 괄호인 경우 Deque의 첫 번째인 '(' 열린 괄호와 마지막에 저장된 ')' 닫힌 괄호를 제거
  5. 2~4번을 반복하며 문자열 끝까지 처리
  6. 올바른 괄호 형태인 경우 Deque는 비어 있어야 함
  7. Deque의 isEmpty()를 활용해 비어 있으면 true, 아니면 false 반환

[소스 코드]

import java.util.*;

class Solution {
    boolean solution(String s) {
        ArrayDeque<Character> que = new ArrayDeque<>();
        
        for(int i = 0 ; i < s.length() ; i++){
            que.addLast(s.charAt(i));
            if(que.peekFirst() == ')') return false;
            if(que.peekLast() ==')') {
                que.pollFirst();
                que.pollLast();
            }
        }
        return que.isEmpty() ? true : false;
    }
}

 

[실행 결과]