[백준 9046]
https://www.acmicpc.net/problem/9012

괄호의 상태를 판단하는 문제이다.
해당 문제는 데이터 구조1 강의 중 나왔던 예제로 한번 풀어본 기억이 있었다.
해당 문제를 풀 때 반드시 알아야 하는 당연한 두가지가 있다.
이때 pop 시 스택이 비어있으면 괄호가 열리기 전에 괄호를 닫거나 괄호의 쌍이 맞지 않기 때문에 NO를 출력하게 된다.
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cn = sc.nextInt();
sc.nextLine();
for (int i = 0; i < cn; i++) {
String check = sc.nextLine();
Stack<Character> stack = new Stack<>();
boolean distinction = true;
for (int j = 0; j < check.length(); j++) {
char ch = check.charAt(j);
if (ch == '(') {
stack.push(ch);
} else {
if (stack.isEmpty()) {
distinction = false;
break;
}
stack.pop();
}
}
스택 객체를 생성한 후 .charAt 메서드를 사용하여 입력받은 문자열을 한글자씩 끊어 비교 후 연산을 수행하였다.
distintion 변수는 YES / NO 결과를 판별하기 위해 사용할 변수이다.
기본값은 true이며 ')' 문자열을 만났을 때 스택이 비어있으면 해당 변수를 false로 변경한다.
if (!stack.isEmpty()) {
distinction = false;
}
if (distinction) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
sc.close();
}
}
입력받은 문자열을 전부 처리한 후에 스택에 괄호가 저장되어 있다면 해당 경우도 괄호의 쌍이 맞지 않으므로 false로 변경해주어야 한다.
이후 최종적으로 boolean 여부에 따라 결과 메시지를 출력하게 된다.
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cn = sc.nextInt();
sc.nextLine();
for (int i = 0; i < cn; i++) {
String check = sc.nextLine();
Stack<Character> stack = new Stack<>();
boolean distinction = true;
for (int j = 0; j < check.length(); j++) {
char ch = check.charAt(j);
if (ch == '(') {
stack.push(ch);
} else {
if (stack.isEmpty()) {
distinction = false;
break;
}
stack.pop();
}
}
if (!stack.isEmpty()) {
distinction = false;
}
if (distinction) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
sc.close();
}
}
해당 코드로 문제를 해결할 수 있었다.

처음에는 최종 결과에서 스택에 요소가 남아있지 않다면 YES를, 그렇지 않다면 NO를 출력하게 코드를 작성하였지만 로직에 오류가 있었는지 출력에 문제가 생겼고 boolean 변수를 사용해서 결과를 판별하기로 하였다.
간단한 해결 방법이였지만 생각을 떠올리기까지 한시간 동안 많은 시도를 해보게 되었고 해당 방법을 도출해낼 수 있었다.
코드를 작성할 때 불필요한 코드를 줄여서 작성하고자 하였는데 이번 역시 코드가 불필요하게 길어진 것 같다.
앞으로는 짧게 써보려고 노력해야겠당!