올바른 괄호
문제
설명
괄호가 입력되면 올바른 괄호이면 “YES”, 올바르지 않으면 ”NO”를 출력합니다.
(())() 이것은 괄호의 쌍이 올바르게 위치하는 거지만, (()()))은 올바른 괄호가 아니다.
입력
첫 번째 줄에 괄호 문자열이 입력됩니다. 문자열의 최대 길이는 30이다.
출력
첫 번째 줄에 YES, NO를 출력한다.
예시 입력 1
(()(()))(()
예시 출력 1
NO
해결방법
- 스택 구조 사용.
- 괄호를 하나 정하고 넣음 ‘(’ 일 때 push, ‘)’일때 pop 하여 반복 수행, 반복을 수행 했는데 자료가 남아있는 경우 혹은 반복 내에 넣어야 하는데 비어있는 경우는 올바르지 못한 경우.
- Stack에서는 push/pop 기본이고, isEmpty/size 등을 기본적으로 사용 가능하다.
코드
import java.util.*;
class Main {
public String solution(String str) {
String answer = "YES";
Stack<Character> stack = new Stack<>();
// 괄호가 쌍인 경우 올바른 것이므로, 여는 괄호일떄 넣고 아닐때 빼면
// 올바른 문자열일 경우 최종적으로는 스택에 아무것도 남지 않아야 한다.
for (char x : str.toCharArray()) {
// 괄호가 여는 경우, 스택에 넣는다.
if (x == '(') stack.push(x);
// 여는게 아닌데,
else {
// 비어있으면 올바르지 못한 것
if (stack.isEmpty()) return "NO";
// 안 비어있다면 꺼낸다.
stack.pop();
}
}
// 다 진행 했는데, 스택에 괄호가 남아있다면 올바르지 않은 것.
if (!stack.isEmpty()) return "NO";
return answer;
}
public static void main(String[] args) {
Main.Main T = new Main.Main();
Scanner kb = new Scanner(System.in);
String str = kb.next();
System.out.println(T.solution(str));
}
}