4949 균형잡힌 세상 ⬛

kkmdevel·2024년 9월 27일

코딩테스트

목록 보기
8/21

📋문제 정리

  • 문자열이 주어지도 () [] 가 짝을 이뤄야한다.
  • )( 순으로 입력되면 짝을 이룰 수 없다.
  • 종료 조건이 "." 이다.

🎯풀이

  • 괄호는 전형적인 Stack 문제다.
    -'(' 가 들어오면 stack에 저장하고 ')'가 입력되면 제일 앞의 것을 꺼낸다.
  • 꺼낸 것이 '('와 같으면 짝을 이룬거고 다르면 짝을 이루지 못한 것이다.

Stack 문제도 마찬가지로 Deque로 해결하면 더 빠르게 해결할 수 있다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;

public class Main {

  static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  static StringTokenizer st;
  static StringBuilder sb =  new StringBuilder();

  public static void main(String[] args) throws IOException {
    String str="";
    
    while(!(str=br.readLine()).equals(".")){ // 입력된 문자열이 . 하나뿐이면 종료
      
      Deque<Character> de = new ArrayDeque<Character>();
      boolean flag = true;

      for(int i=0;i<str.length();i++){
        if(str.charAt(i)=='(' ||str.charAt(i)=='[')
          de.addFirst(str.charAt(i)); // 열린 괄호가 오면 저장

        if(str.charAt(i)==')'){ //닫힌 소괄호일때
          if(de.isEmpty() || de.getFirst() != '('){ // 비었거나 열린 소괄호가 아니면 
            flag = false; // flag를 false로
            break;
          }
          else{
            de.removeFirst();
          }
        }

        if(str.charAt(i)==']'){ //대괄호 일때
          if(de.isEmpty() || de.getFirst() != '['){
            flag=false;
            break;
          }
          else{
            de.removeFirst();
          }
        }
      }
      
      if(de.isEmpty() && flag) // flag도 true고 Deque가 모두 짝을 이루어 비어졌다면
        sb.append("yes \n"); //성공
      else
        sb.append("no \n");
    }
  
    System.out.println(sb);
    br.close();
  }
}
profile
25/08/12

0개의 댓글