알고리즘
[BOJ] 4889번 : 안정적인 문자열 (JAVA)
애용쓰
2023. 1. 20. 17:11
https://www.acmicpc.net/problem/4889
4889번: 안정적인 문자열
입력은 여러 개의 데이터 세트로 이루어져 있다. 각 데이터 세트는 한 줄로 이루어져 있다. 줄에는 여는 괄호와 닫는 괄호만으로 이루어진 문자열이 주어진다. 문자열의 길이가 2000을 넘는 경우
www.acmicpc.net
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));
Stack<Character> stack;
int tc = 1;
while(true){
String input = br.readLine();
stack = new Stack<>();
int cnt = 0;
if(input.contains("-")){
break;
}
for(int i=0;i<input.length();i++){
char tmp = input.charAt(i);
switch (tmp){
case '{':
stack.push('{');
break;
case '}':
if(stack.isEmpty()){
stack.push('{');
cnt++;
}
else{
stack.pop();
}
}
}
int answer = 0;
answer = stack.size()/2 + cnt;
System.out.println(tc+". "+answer);
tc++;
}
}
}
괄호 문제는 Stack을 사용한다.
1. '{' 라면 stack에 push
2. '}' 라면
2-1. stack이 비어있는지 확인하고 비어있다면 '{'로 바꾸고 stack push, cnt++
2-2. 비어있지 않다면 '{'가 있다는 것이므로 stack.pop
3. 모든 문자를 검사하고 나면 stack에 남아있는 문자들은 모두 {일 것이다. 이 때 {중 하나만 }로 바꾸면 안정적 문자열이 되는 것이므로 stack.size() /2를 하면 된다.
4. stack에 넣을 때 바꾼 횟수인 cnt와 stack.size()/2를 더하면 정답이 된다.