[JAVA] 백준 4949 균형잡힌 세상

Kyungmin·2024년 3월 21일
0

JAVA알고리즘

목록 보기
23/23

📎 백준 4949 균형잡힌 세상

  • Stack 문제
< JAVA 코드 >
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;


public class Baek_4949 {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        while (true) {
            String line = bf.readLine();
            if (line.equals(".")) {      // 마지막 종료 조건
                break;
            }
            Stack<Character> stack = new Stack<>();
            boolean check = true;

            for (char x : line.toCharArray()) {
                if (x == '(' || x == '[') {
                    stack.push(x);
                } else if(x == ')') {
                    if(stack.isEmpty() || stack.peek() != '(') {
                        check = false;
                        break;
                    }
                    stack.pop();

                } else if(x == ']') {
                    if(stack.isEmpty() || stack.peek() != '[') {
                        check = false;
                        break;
                    }
                    stack.pop();
                }
            } // end foreach

            if(stack.isEmpty() && check) {
                sb.append("yes\n");
            } else {
                sb.append("no\n");
            }
        } // end while
        System.out.println(sb);
    }
}

✅ 깊이 생각하지 못한 부분

1. Stack 의 초기화

  • Stack stack = new Stack<>();를 while 문 밖에 두면, 각 입력 문자열을 처리할 때마다 스택이 초기화되지 않는다. 이는 한 문자열의 처리가 끝난 후 스택에 남아 있는 괄호들이 다음 문자열의 처리에 영향을 미칠 수 있음을 의미한다. 즉, 이전 문자열에서 열린 괄호가 닫히지 않고 스택에 남아 있다면, 그 상태가 다음 문자열 검사에 그대로 반영되어 잘못된 결과를 초래할 수 있다.
🤷‍♂️ 스택을 초기화하지 않는다면 생기는 문제는?

[()]
[.

다음과 같은 입력이 있다고 하자.
[()] 은 정상적인 균형잡힌 모양이다.
다음으로 [. 는 균형이 잡히지 않았다. 하지만 스택을 초기화 하지않고 다음 문자열로 넘어가게 되어 스택에 여전히 [ 가 남아있는 문제가 생기게된다. 이는 문제에 요구사항에 치명적인 문제가 될 수 있으므로 While 문 안에서 초기화를 시켜줘야한다.

2. 조건문의 사용

처음에 틀렸던 코드는 다음과 같다.
if(!stack.isEmpty() && !check ) {
    sb.append("NO").append("\n");
} else {
    sb.append("YES").append("\n");
}
  • 단순히 스택이 비어있지않고, 위에서 true 가 아니라면 no를 출력하면 되겠지라고 생각하고 코드를 작성했다. 하지만 "[ ( ) " 와 같은 경우 생각과 다른 결과가 나온다. " ( )" 를 처리 했을 때, check 는 true 인 상태이다. 그렇기 때문에 " [ " 가 남았음에도 불구하고 여전히 check 는 true 이므로 문제의 요구사항에 따르면 no 를 출력해야하지만 나의 코드는 당연하게도 yes 를 반환했다.
profile
Backend Developer

0개의 댓글