[백준] 4949번(Java)

나무나무·2025년 1월 3일

백준_코테

목록 보기
6/35

📖 균형잡힌 세상

[ 문제 ]
세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다. 정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램을 짜는 것이다.

문자열에 포함되는 괄호는 소괄호("()") 와 대괄호("[]")로 2종류이고, 문자열이 균형을 이루는 조건은 아래와 같다.

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

정민이를 도와 문자열이 주어졌을 때 균형잡힌 문자열인지 아닌지를 판단해보자.

💡풀이

  • 큐를 생성하고 문자열을 한 글자씩 읽을 때 왼쪽 괄호인 경우 큐에 삽입한다.
  • 오른쪽 괄호가 나오는 경우, 큐에서 제일 위쪽에 존재하는(제거 1순위) 요소와 동일한 종류일 때 큐에서 해당 요소를 지워주고, 다른 종류일 경우에는 "No"를 출력하게 만든다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Deque<String> par = new ArrayDeque<>();

        while(true){
            String str = br.readLine();
            if(str.equals(".")){
                break;
            } else {
                String ans = "yes";
                String[] tmp = str.split("");
                for(int i = 0 ; i < tmp.length ; i ++){
                    switch (tmp[i]) {
                        case ")" :
                            if(!par.isEmpty() && par.peek().equals("(")){
                                par.pop();
                            } else {
                                ans = "no";
                            }
                            break;
                        case "}" :
                            if(!par.isEmpty() && par.peek().equals("{")){
                                par.pop();
                            } else {
                                ans = "no";
                            }
                            break;
                        case "]" :
                            if(!par.isEmpty() && par.peek().equals("[")){
                                par.pop();
                            } else {
                                ans = "no";
                            }
                            break;
                        default:
                            if(tmp[i].equals("(") || tmp[i].equals("{")  || tmp[i].equals("[")){
                                par.push(tmp[i]);
                            }
                            break;
                    }
                }
                if(!par.isEmpty()){
                    ans = "no";
                }
                System.out.println(ans);
            }
            par.clear();
        }
    }
}



백준 4949번 : https://www.acmicpc.net/submit/4949/88107836

profile
백엔드 개발자 나무입니다

0개의 댓글