Coram Deo

[백준 Java] 9012. 괄호 본문

알고리즘 공부

[백준 Java] 9012. 괄호

탁탁슝 2024. 6. 11. 16:45

Stack 관련 예제

이 문제를 풀면서 한참동안 원하는 결과가 나오지않아 고민했다.

 

- 원인

  • 문제의 원인은 테스트케이스를 실행한 후 그 다음 테스트케이스를 시작할 때, stack을 비우지 않았던 점이었다.

위의 예제입력에서 세번째줄이 계속해서 YES가 아닌 NO가 나왔다.

그런데 세번째줄만 단독으로 실행했을때는 YES가 잘 나왔다.

디버깅을 계속했는데도 처음에 원인을 몰랐던 이유는 세번째줄의 초기 rightCount값과 leftCount값이 예상한 결과대로 출력되어 뒤에도 맞았겠거니 넘겼던 게 화근이었다.

 

- 배운점

  • 앞으로는 초기화할때 stack도 비우자 ㅎㅎ
  • * stack.clear() - stack 비우는 메서드
  • 덕분에 인텔리제이에서 디버깅하는 법에 익숙해졌다.
    • 중단점 잡고 변수값 확인하기 !
import java.io.*;
import java.util.*;

class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        Stack<Character> stack = new Stack<>();
        String[] inputs = new String[t];

        int rightCount;
        int leftCount;
        String result;

        for(int k=0; k<t; k++) {
            inputs[k] = br.readLine();
        }

        for (int i = 0; i < t; i++) {
            // 테스트 케이스마다 모든 변수를 초기화 해줘야 함.
            // stack 초기화 안해서 디버깅 엄청 오래걸림.
            rightCount = 0;
            leftCount = 0;
            result = "YES";
            stack.clear();

            for(int j=0; j<inputs[i].length(); j++) {
                stack.push(inputs[i].charAt(j));
            }

            while (!stack.isEmpty()) {
                if (stack.peek()==')') {
                    stack.pop();
                    leftCount++;
                } else if(stack.peek()=='(') {
                    stack.pop();
                    rightCount++;
                    if (leftCount < rightCount) {
                        result = "NO";
                        break;
                    } else {
                        leftCount--;
                        rightCount--;
                    }
                }
            }
            
            if(leftCount!=0 && rightCount==0) {result = "NO";}
            System.out.println(result);
        }
    }
}