문) 닫힌 괄호는 VPS, 최종 형태가 VPS이면 YES 아니면 NO 출력
입) 입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다.
풀이
논리는 간단하다.
1. '(' 일 때만 stack에 push, ')' 만나면 pop.
2. 최종적으로 남아있는 게 있으면 NO.
다만, 1글자씩 입력 받는 것과 ')' 가 연속 2번 입력될 때 문제 해결하느라 시간이 지체됐다.
1글자씩 입력받기
이번 풀이에선 BufferedReader를 사용했는데, Scanner도 그렇고 한 글자씩 입력받는 게 안 되는 거다.
- StringTokenizer, ""로 구별
▶ br.readLine()과 다를 바 없이 문장으로 입력됐다(공백 구분 시도하니 정답 출력됨).
StringTokenizer st = new StringTokenizer(br.readLine(), "");
- split("") ▶ b를 위한 for문을 돌면서 오답이 출력됨.
String a = br.readLine();
String[] b = a.split("");
- 마지막 시도, charAt
한번에 입력받은 a값을 그 길이만큼 돌면서 한 글자씩 보니 정상적으로 답이 출력됐음.
불필요한 코드 없이 최적의 내용만 남은 듯.
')' 가 연속 입력될 때
1. '(' 일 때만 stack에 push, ')' 만나면 pop.
2. 최종적으로 남아있는 게 있으면 NO.
이 논리에 따르다보면 마주할 수 있는 문제가 괄호 닫기, ')'가 2번 연속 입력될 때이다.
비어있는 stack 값을 pop할 수 없으므로, stack 값이 아무것도 없을 때 처리를 해야 한다.
제일 처음, 그리고 끝까지 생각했던 부분이 if (stack.isEmpty()) {~} 로 처리하는 것이었다.
그런데 이렇게 되면 출력 결과가 이상해진다.
(예) ( ( ) ) ( ( ▶ 정상 : NO | 현재 : YES
그 이유는 중간에 [stack.isEmpty() == true] 되는 경우의 수가 있어서다.
이를 방지하기 위해선 empty대신, [stack.size() == 0] 일 때의 논리를 사용하면 된다.
그럼 정상 출력 완료!
코드(BufferedReader + BufferedWriter)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Stack<Character> stack = new Stack<>();
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
String a = br.readLine();
for(int j=0; j<a.length(); j++) {
char b = a.charAt(j);
if (b == '(') {stack.push(b);}
else {
if(stack.size() == 0) {stack.push(b); break;}
else {stack.pop();}
}
}
if (stack.isEmpty()) bw.write("YES" + "\n");
else bw.write("NO" + "\n");
stack.clear();
}
br.close();
bw.flush();
bw.close();
}
}
'알고리즘' 카테고리의 다른 글
[백준] 큐 - 18258번 (1) | 2023.10.18 |
---|---|
[백준] DP - 11722번, 가장 긴 감소하는 부분 수열 (0) | 2023.10.18 |
[백준] DP - 11055번, 가장 큰 증가하는 부분 수열 (1) | 2023.10.05 |
[백준] DP - 11053번, 가장 긴 증가하는 부분 수열 (다른 풀이 봄) (1) | 2023.10.04 |
[백준] DP - 2156번, 포도주 시식 (다른 풀이 봄) (0) | 2023.10.03 |