ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] - 올바른 괄호 (12909) (Stack)
    알고리즘/프로그래머스 2024. 3. 15. 10:39

    📚 문제 - 12909

    괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어 "()()" 또는 "(())()" 는 올바른 괄호입니다. ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다. '(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.


    제한사항

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

    입출력 예

    s answer
    "()()" true
    "(())()" true
    ")()(" false
    "(()(" false
    • 입출력 예 #1
      문제의 예시와 같습니다.

    ⌨️ 작성한 코드

    import java.util.Stack;
    
    class Solution {
        public boolean solution(String s) {
            Stack<Character> stack = new Stack<>();
            
            for (char c : s.toCharArray()) {
                if (c == '(') {
                    stack.push(c);
                } else {
                    if (stack.isEmpty()) { // ')'인데 스택이 비어있으면 올바르지 않은 괄호
                        return false;
                    }
                    stack.pop(); // 짝이 맞는 경우 스택에서 제거
                }
            }
            
            return stack.isEmpty(); // 순회 후, 스택이 비어있으면 올바른 괄호
        }
    }
    • 접근 방식:
      ")()("처럼 ")"로 시작하면 올바르지 않은 괄호이므로, 이를 토대로 조건문을 작성했다. "("로 시작하면 스택에 넣고, 아니면서 비어있으면 false를 반환한다. 비어있지 않은 경우에는 스택의 맨 위에 있는 요소를 제거한다. 순회 후 마지막에 스택이 비어있으면 올바른 괄호이므로 true를 아니면 false를 return하도록 했다.

    ✅ 배운 점

    [ 스택(Stack) ]

    데이터를 저장하고 검색할 때 사용되는 추상 자료형(ADT) 중 하나입니다. 데이터를 선형으로 저장하며, 후입선출(LIFO, Last In First Out) 원칙에 따라 동작합니다. 즉, 가장 최근에 삽입된 요소가 가장 먼저 제거됩니다.

     

    주요 메서드:

    • top: 삽입과 삭제가 일어나는 위치
    • push: top위치에 새로운 데이터를 삽입하는 연산
    • pop: top위치에 현재있는 데이터를 삭제하고 확인하는 연산
    • peek: top위치에 현재있는 데이터를 단순 확인하는 연산
      // 스택 생성
      Stack<Integer> stack = new Stack<>();
      
      // Push: 스택에 요소 추가
      stack.push(1);
      stack.push(2);
      stack.push(3);
      
      // 스택: [1, 2, 3]
      
      // Peek 또는 Top: 스택의 맨 위 요소 조회 (제거하지 않음)
      int topElement = stack.peek(); // topElement는 3
      System.out.println("Top element: " + topElement); // 출력: Top element: 3
      
      // Pop: 스택의 맨 위 요소 제거 및 반환
      int poppedElement = stack.pop(); // poppedElement는 3
      System.out.println("Popped element: " + poppedElement); // 출력: Popped element: 3
      
      // 스택 상태: [1, 2]
      
      // isEmpty: 스택이 비어 있는지 여부 확인
      boolean isEmpty = stack.isEmpty(); // isEmpty는 false
      System.out.println("Is stack empty? " + isEmpty); // 출력: Is stack empty? false
      
      // 스택의 크기 확인
      int size = stack.size(); // size는 2
      System.out.println("Stack size: " + size); // 출력: Stack size: 2
      
      // 스택 순회 및 출력
      System.out.print("Stack elements: ");
      while (!stack.isEmpty()) {
          int element = stack.pop();
          System.out.print(element + " ");
      }
      System.out.println(); // 개행
      // 출력: Stack elements: 2 1
      
      // 스택이 비어있는지 다시 확인
      isEmpty = stack.isEmpty(); // isEmpty는 true
      System.out.println("Is stack empty? " + isEmpty); // 출력: Is stack empty? true

     

     

Designed by Tistory.