알고리즘/백준
BOJ) 균형잡힌 세상
Zin0_0
2020. 6. 23. 21:34
반응형
균형잡힌 세상
4949번: 균형잡힌 세상
문제 세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다. 정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단
www.acmicpc.net
풀이
정규식을 활용하면 시간도 덜 들고 풀기 쉽지 않을까 싶어서 정규식을 활용했다.
replaceAll에 들어가는 부분인 "[^[]()]" 이 부분은 [ ] 안에 있는 문자들에 대해서 검사를 한다.
[ ] 안에 ^가 들어가 있다면 해당 문자를 제외한 모든 글자를 의미한다.
따라서, [ ^ [ ] ( ) ] ( 보기 좋기 위한 띄어쓰기는 양해 부탁드립니다..)는 괄호로 여닫는 문자가 아닌 문자들을 의미한다.
replaceAll을 수행하고 나면 띄어쓰기가 제거된 괄호만 남게 된다.
So when I die (the [first] I will see in (heaven) is a score list). => ([]())
([ (([( [ ] ) ( ) (( ))] )) ]). => ([(([([])()(())]))])
. => 빈 문자열
남은 문자열을 가지고 스택에 넣으면서, 올바르게 괄호가 열리고 닫혔는지 검증하기만하면 쉬운 문제였다.
Stack을 사용해서 속도나 메모리가 좋지는 않지만, 문제를 푸는데는 큰 문제가 없어서 다시 풀지는 않았다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class BalncedString_4949 {
final static String YES = "yes", NO = "no", END = ".";
final static char[] openBracket = {'[','('}, closeBracket = {']',')'};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inputStr ="";
while(!(inputStr = br.readLine()).equals(END)) {
inputStr = inputStr.replaceAll("[^\\[\\]\\(\\)]","");
Stack<Character> bracket = new Stack<>();
loop:
for(int i=0; i<inputStr.length(); i++) {
char ch = inputStr.charAt(i);
if(ch == openBracket[0] || ch == openBracket[1]) { // open
bracket.push(ch);
} else if(ch == closeBracket[0]) { // ]
if(bracket.empty()) {
bracket.push(openBracket[0]);
break loop;
} else if(bracket.peek() == openBracket[0]){
bracket.pop();
} else { // (가 먼저 나옴
break loop;
}
} else { // )
if(bracket.empty()) {
bracket.push(openBracket[1]);
break loop;
} else if(bracket.peek() == openBracket[1]){
bracket.pop();
} else { // [가 먼저 나옴
break loop;
}
}
}
if(bracket.size() ==0) {
System.out.println(YES);
} else {
System.out.println(NO);
}
}
}
}
반응형