Algorithm/백준

[Java][백준] 4949번 균형잡힌 세상

jisu-jeong0 2024. 4. 12. 17:43
 

4949번: 균형잡힌 세상

각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에

www.acmicpc.net


입력

So when I die (the [first] I will see in (heaven) is a score list).
[ first in ] ( first out ).
Half Moon tonight (At least it is better than no Moon at all].
A rope may form )( a trail in a maze.
Help( I[m being held prisoner in a fortune cookie factory)].
([ (([( [ ] ) ( ) (( ))] )) ]).
 .
.

출력

yes
yes
no
no
no
yes
yes

 

아이디어

문제를 깊이 읽지 않아도 알 수 있다. 스택으로 풀면 된다!

  • 각 괄호는 짝이 맞아야 한다.
  • 온점이 나오면 반복문을 종료한다.
  • 스택이 비어있다면 "yes", 비어있지 않다면 "no"를 출력한다.

 

 

주요 코드

1. 반복문 구현

while (true) {
     String str = br.readLine();
     if (str.equals(".")) break;

     Stack<String> stack = new Stack<>();

 

입력된 값을 line 단위로 받는다. 이때 입력 값에 "."이 있다면 반복문을 종료한다.

 

 

2. 입력된 각 문자를 비교

String[] sentence = str.split("");
for(String word : sentence){
	switch (word) {
    	case ("("):
        case ("["):
        	stack.push(word);
            break;
        case (")"):
            if(!stack.isEmpty() && stack.peek().equals("("))
            	stack.pop();
            else stack.push(")");
            break;
        case ("]"):
            if(!stack.isEmpty() && stack.peek().equals("["))
            	stack.pop();
            else stack.push("]");
            break;
    }
}

 

공백으로 구분하여 한 문자씩 반복문을 수행한다. 

  • "(" 나 "[" 인 경우 : 스택에 해당 문자를 넣어준다.
  • ")" 인 경우:
    • 스택이 비어있지 않고, 가장 최근 값이 "(" : 최근 값을 꺼내준다.
    • 아니라면 ")" 을 스택에 넣는다.
  • "]" 인 경우:
    • 스택이 비어있지 않고, 가장 최근 값이 "[" : 최근 값을 꺼내준다.
    • 아니라면 "]" 을 스택에 넣는다

 

3. stack 내부 확인

if (stack.empty()){ 
	sb.append("yes").append('\n'); 
} else {
	sb.append("no").append('\n');
}

 

반복문 종료 후 스택이 비어있다면 yes, 비어있지 않다면 no를 출력한다.

 

 

 

 

전체 코드

더보기
import java.io.*;
import java.util.Stack;

public class BJ_4949 {
    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;

            Stack<String> stack = new Stack<>();

            String[] sentence = str.split("");
            for(String word : sentence){
                switch (word) {
                    case ("("):
                    case ("["):
                        stack.push(word);
                        break;
                    case (")"):
                        if(!stack.isEmpty() && stack.peek().equals("("))
                            stack.pop();
                        else stack.push(")");
                        break;
                    case ("]"):
                        if(!stack.isEmpty() && stack.peek().equals("["))
                            stack.pop();
                        else stack.push("]");
                        break;
                }
            }

            if (stack.empty()) {
                sb.append("yes").append('\n');
            } else {
                sb.append("no").append('\n');
            }
        }
        System.out.println(sb);
    }
}