알고리즘
[백준] 4949번 균형잡힌 세상 _ JAVA ( 주석 설명 ) 본문
풀이
1) 열린 괄호 '(' , '{' '[' 가 나오면 stack 에 push 를 한다.
2) 닫힌 괄호 ')', '}', ']' 가 나오면 stack 에서 pop 을 한다.
이 때 stack이 비어있거나 stack 에 가장 위의 값(peek())과 매칭이 되지 않으면 false(불균형)을 return 한다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
while(true){
String str = br.readLine();
if(str.equals(".")) //"."이 올 때까지 반복
break;
char[] sentence = str.toCharArray();
boolean result = solve(sentence); //문장마다 solve() 실행
if(result){ //문자열이 균형을 이루고 있으면 "yes"
sb.append("yes").append('\n');
}
else{ //불균형이면 "no"
sb.append("no").append('\n');
}
}
System.out.println(sb);
}
private static boolean solve(char[] sentence) {
Stack<Character> stack = new Stack<>(); //괄호 매칭을 위한 stack 생성
for(char i : sentence){
if(i == '(' || i == '{' || i=='[') //열린 괄호를 만나면 stack에 push를 해준다.
stack.push(i);
else if (i == ')'){ //닫힌 괄호를 만나면 검사
if(stack.empty() || stack.peek() != '(') //비어있는 경우 or 가장 최근 괄호와 매칭 시 불일치 => false
return false;
else //괄호 매칭이 되면 pop 진행
stack.pop();
}
else if (i == '}'){
if(stack.empty() || stack.peek() != '{')
return false;
else
stack.pop();
}
else if (i == ']'){
if(stack.empty() || stack.peek() != '[')
return false;
else
stack.pop();
}
}
if(!stack.empty()){ //한 쪽 괄호가 더 많을 경우 false
return false;
}
return true; //나머지는 모두 true
}
}
'백준 - JAVA > 스택' 카테고리의 다른 글
[백준] 1874번 스택 수열 _ JAVA ( 주석 설명 ) (0) | 2023.03.17 |
---|---|
[백준] 9012번 괄호 _ JAVA ( 주석 설명 ) (0) | 2023.03.10 |
[백준] 10773번 제로 _ JAVA ( 주석 설명 ) (0) | 2023.03.10 |
[백준] 10828번 스택 _ JAVA ( 주석 설명 ) (0) | 2023.03.09 |