CodingTEST

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

경걍 2023. 12. 5. 00:44
반응형

백준 4949번 문제 - 균형잡힌 세상

 

4949번: 균형잡힌 세상

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

www.acmicpc.net


문제 분석

 

  • 다음 규칙을 만족하면 yes 아니면 no 를 출력해라
    • 모든 왼쪽 소괄호("(")는 오른쪽 소괄호(")")와만 짝을 이뤄야 한다.
    • 모든 왼쪽 대괄호("[")는 오른쪽 대괄호("]")와만 짝을 이뤄야 한다.
    • 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.
    • 모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다.
    • 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.

 

해결 키 포인트

 

  • Deque로 열어져있는 괄호를 보관한다.
    • '[' , '(' 일 경우 Deque에 문자 추가
  • ']' , ')' 일 경우 Deque 끝에 있는 문자 확인
    • Deque가 비어있거나 끝에 문자와 현재 닫혀지는 문자가 다른 경우 no 출력
  • 마지막에 문자열 끝이 . 인지 확인 
    •  s.charAt(s.length()-1) == '.'

코드

 

import java.awt.*;
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));

        while(true) {
            String s = br.readLine();

            if(s.equals(".")) break;

            Deque<Character> lastPl = new LinkedList<>();

            boolean isStringCheck = true;
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);

                char check = ' ';
                switch (c) {
                    case '[':
                    case '(':
                        lastPl.add(c);
                        break;
                    case ']':
                        check = '[';
                        break;
                    case ')':
                        check = '(';
                        break;
                }

                if(check != ' ' && (lastPl.isEmpty() || lastPl.pollLast() != check)) {
                    isStringCheck = false;
                }

                if(!isStringCheck)
                    break;
            }
            if(isStringCheck && lastPl.isEmpty() && s.charAt(s.length()-1) == '.') {
                System.out.println("yes");
            }
            else {
                System.out.println("no");
            }
        }
    }
}
반응형