728x90
<문제>
https://www.acmicpc.net/problem/4949
4949번: 균형잡힌 세상
각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에
www.acmicpc.net
<풀이>
무엇인가 짝짓는 문제 같은 경우 스택으로 풀어야 된다는 생각을 했다. 그래서 스택을 이용해서 문제를 해결했다.
스택을 이용해 괄호를 넣고, 해당 문제에서 ) ] 이러한 괄호가 들어왔을 때 스택이 비어있거나, 스택에 최상단에 있는 문자가 짝을 지을 수 없는 괄호 일경우 해당 문자열은 균형 잡힌 문자열이 아닌 것을 바로 알 수 있기 때문에 더 이상 확인하지 않고 바로 no를 출력하면 되기 때문에 효율성을 위해 문자열 검사하는 함수를 만들어서 구현했다.
문자가 ( , [ 이러한 문자열이 들어오면 스택에 넣는다.
문자가 ) 일때, 스택이 비어있거나 스택의 최상단 문자가 ( 가 아닐 경우 문자열 no를 리턴한다. 조건이 아닐 경우에는 스택을 pop 한다.
문자가 ]일 때 스택이 비어있거나 스택의 최상단 문자가 ]가 아닐 경우 문자열 no를 리턴한다. 조건이 아닐 경우에는 스택을 pop 한다.
모든 문자를 확인한 후에 스택이 비어있으면 yes를 리턴하고 스택이 비어있지 않을 경우 no를 리턴한다.
<코드>
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));
StringBuilder sb = new StringBuilder();
String s;
while(true) {
s = br.readLine();
String result = f(s);
if(s.equals(".")) break;
sb.append(result + "\n");
}
System.out.println(sb);
}
public static String f(String s) {
Stack<Character>stack = new Stack<>();
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(c == '(' || c =='[') stack.push(c);
else if(c == ')') {
if(stack.empty() || stack.peek() != '(') return "no";
else stack.pop();
}
else if(c == ']') {
if(stack.empty() || stack.peek() != '[') return "no";
else stack.pop();
}
}
if(stack.empty()) return "yes";
else return "no";
}
}
728x90
'Algorithm > 백준 자바' 카테고리의 다른 글
백준 1068 자바 (0) | 2024.02.15 |
---|---|
백준 14502 자바 (1) | 2024.01.27 |
백준 1620 자바 (0) | 2024.01.09 |
백준 9996 자바 (1) | 2024.01.09 |
백준 11655 자바 (1) | 2024.01.03 |