본문 바로가기
Problem Solving/Baekjoon

[백준] 4949 균형잡힌 세상 - Data Structure / Java

by graycode 2022. 11. 2.

 문제 링크

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

 

 풀이 과정

하나 또는 여러 줄의 입력된 문자열이 "." 일 때까지 문자열을 입력받는다.

미리 생성한 제네릭이 Character 인 Stack 에 각 문자열 처리 완료시마다 clear 하여 비운다.

 

각각의 문자열을 토큰 단위로 쪼개어 토큰이 여는 괄호일 시  ('(' || '[') 스택에 push 하고,

닫는 괄호일 시 (')' || ']') 스택이 비어있지 않고, peek 으로 확인한 스택 상단의 값이 토큰과 짝이 맞는 여는 괄호일 시 

해당 여는 괄호를 pop 하여 제거한다.

 

그렇지 않다면 닫는 괄호 또한 스택에 push 한다.

 

이러한 과정을 거친 후 문자열이 올바르게 여는 괄호에 상응하는 닫는 괄호로 이루어진 문자열이라면

스택이 비어있을 것이고, 아니라면 잔여 토큰이 남아있을 것이다.

 

이에 따라 stk.empty() ? "yes" : "no"  삼항 연산자를 통해 정답을 출력한다.

 

• 풀이 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;

public class Main {

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

        Stack<Character> stk = new Stack<>();

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

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

            stk.clear();
            for (int i = 0; i < input.length(); i++) {
                char token = input.charAt(i);

                if (token == '(' || token == '[')
                    stk.push(token);
                else if (token == ')' && !stk.empty() && stk.peek() == '(')
                    stk.pop();
                else if (token == ']' && !stk.empty() && stk.peek() == '[')
                    stk.pop();
                else if (token == ')' || token == ']')
                    stk.push(token);
            }

            bw.write((stk.empty() ? "yes" : "no") + "\n");
        }

        bw.flush();
    }

}

댓글