알고리즘 풀이/백준(BOJ)

[JAVA/백준9012] 괄호 - 스택

닥스훈스 2019. 6. 8. 22:03

문제

풀이

테스트케이스만큼 문자열을 입력받는데, 이때 한번 입력받을때 괄호검사를 하는 함수를 호출한다.
괄호검사를 하는 함수 isCorrect()는 호출될때마다 스택을 새로 생성한다. 문자열의 길이만큼 검사를 해주는데, 이때 스택이 비었을 경우에는 문자열의 i번째 문자를 스택에 넣어준다. 스택이 비어있지 않으면 스택의 가장 위(peek())와 i번째 문자를 비교해준다. 이때 주의할점은 처음에 단순히 (와 ), 또는 )와 (처럼 괄호가 같지 않으면 pop이 되도록 해주었는데 괄호가 닫히는 모양은 스택의 top은 항상 '('이어야 하고 스택에 넣을 문자는 항상 ')'이어야 한다. 이점만 유의하고, 스택클래스를 사용한적이 있다면 삽질하지 않고 빠르게 풀 수 있을 문제였다 ㅠㅠ 

소스코드

import java.util.*;

public class Main {
	public static int T;
	public static Scanner sc;

	public static void main(String[] args) {
		sc = new Scanner(System.in);
		T = sc.nextInt();
		sc.nextLine(); // 개행문자 제거
		for (int i = 0; i < T; i++) {
			String s = sc.nextLine();
			isCorrect(s);
			System.out.println(" ");
		}
	}

	public static void isCorrect(String s) {
		Stack st = new Stack(); // 스택 생성
		for (int i = 0; i < s.length(); i++) {
			// System.out.println(st);
			if (st.isEmpty()) {
				st.push(s.charAt(i));
			} else {
				char a = (char) st.peek();
				char b = s.charAt(i);

				if (a == '(' && b == ')') { // ()형태일 경우에만
					st.pop();

				} else {
					st.push(s.charAt(i));
				}
			}
		}
		if (st.isEmpty()) { // 스택이 비어있다면
			System.out.printf("YES");
		} else {
			System.out.print("NO");
		}
	}
}