https://www.acmicpc.net/problem/9012
9012번: 괄호
괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고
www.acmicpc.net
문제 설명:
문자열이 주어졌을 때 주어진 괄호 문자열이 VPS 인지 아닌지를 판단하는 문제이다.
만약 () 으로 계속 맞아떨어진다면 True 이고 )(이거나 (만 있다던가 하면 NO이다.
풀이:
- flag 설정한다. 디폴트 값은 True
- 받아온 문자열 split()으로 문자를 확인하여 "("면 스택에 넣는다.
- 문자가 ")"이면 스택을 확인한다 가장 마지막에 들어간 문자가 "(" 이면 pop 한다. -> "( " -> 스택에 있던 문자 / ")" 받은 문자
- 만약 받은 문자가 ")" 인데 스택에 있던 문자 ")" 라면 조건이 성립되지 않는다.
- 받은 문자가 ")" 인데 스택에 아무것도 없다면? VPS 맞출수 있는 문자가 없기때문에 검증 할 필요 없이 break 한다.
- 받은 문자열을 다 확인했을 때 스택에 남은 문자가 있다면 VPS가 맞지 않아 남은 문자열이기 때문에 "NO" / flag가 False 이면 조건에 걸린 것
Python
n = int(input())
for case in range(n):
data = input()
stack = []
flag = True
for val in data:
if val == "(":
#받아온 문자열 split()으로 문자를 확인하여 "("면 스택에 넣는다.
stack.append(val)
elif val == ")" and stack:
#문자가 ")"이면 스택을 확인한다
stack.pop()
elif val == ")" and len(stack) == 0:
# 받은 문자가 ")" 인데 스택에 아무것도 없다면? VPS 맞출수 있는 문자가 없다
flag = False
break
#받은 문자열을 다 확인했을 때 스택에 남은 문자가 있다면 VPS가 맞지 않아 남은 문자열이기 때문에 "NO"
# flag가 False 이면 조건에 걸린 것
if flag == False or stack:
print("NO")
else:
print("YES")
Java
import java.util.Scanner;
import java.util.Stack;
public class Baekjoon_9012 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int t = in.nextInt();
for (int i = 0; i < t; i++) {
String sen = in.next();
Boolean flag = true;
Stack<String> stack = new Stack<>();
for (String s : sen.split("")){
if(s.equals("(")){
stack.push(s);
}
else if(s.equals(")") && !stack.isEmpty()){
stack.pop();
}
else if(s.equals(")") && stack.isEmpty()){
flag = false;
break;
}
}
if(flag == false || !stack.isEmpty()){
System.out.println("NO");
}else{
System.out.println("YES");
}
}
}
}
'코딩테스트 > 백준' 카테고리의 다른 글
[Python][Java] 백준 1021번. 회전하는 큐 (1) | 2023.11.20 |
---|---|
[Python/Java] 백준 4949번. 균형잡힌 세상 (0) | 2023.11.19 |
[Python] 백준 1753번. 최단경로 (0) | 2023.11.03 |
[Python] 백준 2512. 예산 (0) | 2023.11.01 |
[Python] 백준 2805. 나무자르기 (1) | 2023.11.01 |