본문 바로가기
자료구조&알고리즘/스택

[백준] 문자열, 스택 - 4949번 균형잡힌 세상(Java)

by _din 2022. 5. 20.

혹시 ! 다음 문제를 공부하지 않으셨다면, 이 문제를 먼저 풀고 오시는 것을 추천드립니다 👍

2022.05.20 - [자료구조&알고리즘/스택] - [백준] 문자열, 스택 - 9012번 괄호 (Java) 

 

문제링크

링크

 

4949번: 균형잡힌 세상

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 각 줄은 마침표(".")로 끝난다

www.acmicpc.net

 

 

 

접근한 방법

  • 문자열, 스택

 


풀이방법

  • 9012번 문제를 풀었다면, 대괄호처리하는 것만 추가해주면 된다.
  • 여는 소괄호, 대괄호를 만나면 stack에 push
  • 닫는 소괄호를 만났을 때
    • stack이 비어있거나 peek한 값이 여는 소괄호가 아닌 경우 실패처리
    • 아니라면 stack의 값을 pop
  • 닫는 대괄호를 만났을 때
    • stack이 비어있거나 peek한 값이 여는 대괄호가 아닌 경우 실패처리
    • 아니라면 stack의 값을 pop
  • 마지막으로 모든 탐색을 끝냈는데 stack에 남아있다면 실패처리

소스코드 작성 방법

  • 스택과 성공 여부를 판단하는 변수 선언
  • charAt으로 차례로 각 문자를 탐색 (String.valueOf()로 한번 감싸서 String으로 처리해주었다.)
  • .equals()로 문자열 비교하여 앞서 풀이방법에서 이야기했던 로직을 수행한다.

 

소스코드

package baekjoon.string;
import java.io.*;
import java.util.Stack;

public class Q_4949_BalancedWorld {
    public static boolean solution(String str){
        Stack<String> stack = new Stack();
        boolean isPossible = true;

        for (int i = 0; i < str.length(); i++) {
            String c = String.valueOf(str.charAt(i));

            // 여는 괄호이면 stack에 push
            if(c.equals("(") || c.equals("[")){
                stack.push(c);
            // 닫는 소괄호일 경우
            } else if(c.equals(")")){
                // 스택이 비어있거나 peek한 값이 여는 소괄호가 아닌 경우
                if(stack.empty() || !stack.peek().equals("(")){
                    return false;
                // stack에 여는 괄호가 존재한다면 스택의 값을 pop
                } else {
                    stack.pop();
                }

            // 닫는 대괄호일 경우
            } else if(c.equals("]")){
                // 스택이 비어있거나 peek한 값이 여는 대괄호가 아닌 경우
                if(stack.empty() || !stack.peek().equals("[")){
                    return false;
                // stack에 여는 괄호가 존재한다면 스택의 값을 pop
                } else {
                    stack.pop( );
                }
            }
        }

        if(!stack.empty())
            return false;


        return isPossible;

    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        while(true){
            String str = br.readLine();
            if(str.charAt(0) == '.'){
                break;
            }

            boolean isPossible = solution(str);
            if(isPossible){
                bw.write("yes\n");
            } else {
                bw.write("no\n");
            }

        }

        br.close();
        bw.close();
    }

}
반응형

댓글