자료구조/문제풀이

[백준 JAVA] 9012 괄호

휴먼코딩 2024. 7. 8. 15:02

9012 괄호

https://www.acmicpc.net/problem/9012

문제설명

stack을 사용한 데이터 삽입, 추출

접근방식

O(N) 선형 시간복잡도

 

각 테스트 케이스마다 주어진 문자열을 순회하면서 스택을 활용하여 괄호의 짝을 확인한다

주어진 문자열의 길이를 n이라고 할 때,
각 문자열에 대해 한 번 순회한다.

스택 연산(pop, push)은 상수 시간 O(1)이 소요되는데
각 테스트 케이스의 시간복잡도는 O(n)이다. 

전체 테스트 케이스의 수를 T라고 하면, 전체 코드의 시간복잡도는 O(T×n)가 된다.


문제 조건 분석 과정

 

1. () 을 이루기 위해선 한개의 ( 가 있을 경우 )가 무조건 있어야한다.
2. stack에 ( 를 넣고  만약 다음 문자가 없을 경우 )를 삽입하고 종료하거나
3. 있을 경우 반환한다

자료구조

Stack<Character>

 

  • push: stack.push(item)을 사용하여 스택의 맨 위에 문자 item을 추가.
  • pop: stack.pop()을 호출하여 스택의 맨 위에 있는 값을 제거하고 반환.
  • peek: stack.peek()을 호출하여 스택의 맨 위에 있는 값을 조회. 제거하지 않고 값을 가져온다.
  • empty: stack.empty()를 사용하여 스택이 비어있는지 여부를 확인한다. 비어있으면 true, 아니면 false를 반환한다.

 

틀린이유

stack 자료구조에 대한 공부

올바른 접근 방식 및 해결 방식

문제를 풀기 전에 어떤 자료구조를 사용하는지, 
풀이방법은 어떻게 되는지 미리 파악하고
문제를 푸는 습관을 가지자

 

전체코드

package week02_선형자료구조;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class Main_9012스택 {
    public static void main(String[] args) throws IOException {
        //틀린경우
        //( 혹은 )만 있을 경우
        //(( 혹은 ))만 있는 경우
        //( + )) (( + )
        // = 여는 괄호와 닫는 괄호는 한쌍

        //풀이
        //스택에 (삽입
        //( 가 비어있는지 확인
        //비어있으면 ) 삽입 아니면 반환
        //비어있으면 YES, 아니면 NO
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        for (int i = 0; i < T; i++) {
            String s = br.readLine();
            Stack<Character> stack = new Stack<Character>();

            for (int j = 0; j < s.length(); j++) {
                if (s.charAt(j) == '(') {
                    stack.push(s.charAt(j));
                } else {
                    if (stack.empty()) {
                        stack.push(s.charAt(j));
                        break;
                    } else {
                        stack.pop();
                    }
                }
            }
            if (stack.empty()) System.out.println("YES");
            else System.out.println("NO");
        }
    }
}