코딩테스트/기타
[Stack] 올바른 괄호 .java
머밍
2024. 11. 4. 22:26
설명
괄호가 입력되면 올바른 괄호이면 “YES", 올바르지 않으면 ”NO"를 출력합니다.
(())() 이것은 괄호의 쌍이 올바르게 위치하는 거지만, (()()))은 올바른 괄호가 아니다.
입력
첫 번째 줄에 괄호 문자열이 입력됩니다. 문자열의 최대 길이는 30이다.
출력
첫 번째 줄에 YES, NO를 출력한다.
예시 입력 1
(()(()))(()
예시 출력 1
NO
내 풀이
Stack 스택
:LIFO
1. 여는 괄호만 스택에 넣는다
2. 닫힌 괄호를 만났을 때 스택에 비어있지 않으면 pop하고 비어있으면 잘못된 괄호이다
3. 문자열을 끝까지 순회한 뒤에 스택에 여는 괄호가 남아있다면 잘못된 괄호
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean answer = true;
String str = sc.nextLine();
Stack<Character> st = new Stack<>();
for(char c : str.toCharArray()){
if(c == '(') st.push(c);//여는 괄호 push
else {//닫는 괄호이면
if(st.isEmpty()) {//비어있으면 잘못된 괄호
answer = false;
break;
} else st.pop();
}
}
if(!st.isEmpty()) answer = false;//스택에 남아있으면 잘못된 괄호
System.out.print(answer?"YES" : "NO");//참이면 YES, 거짓이면 NO 출력
}
}
다른 풀이
내 풀이를 함수형으로 구현하여 올바르지않다고 판단되면 바로 return 하는 점이 다르다
import java.util.Scanner;
import java.util.Stack;
public class Main {
public String solution(String str){
String answer = "YES";
Stack<Character> stack = new Stack<>();
for(char c : str.toCharArray()){
if(c == '(') stack.push(c);
else {
if(stack.isEmpty()){
return "NO";
} else stack.pop();
}
}
if(stack.isEmpty()) return "NO";
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(T.solution(str));
}
}