[백준 4949] 균형잡힌 세상 - JAVA [스택 사용]
본문 바로가기

알고리즘/백준

[백준 4949] 균형잡힌 세상 - JAVA [스택 사용]

728x90
반응형

안녕하세요 놀이방 사장입니다.

 

이번 포스팅은 

백준 4949 "균형잡힌 세상" 문제입니다.

 

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

 

백준 9012번 괄호를 푸신 분이라면 쉽게 풀 수 있다고 생각합니다.

() 에서 []가 추가된 문제입니다.

([]) -> 이렇게 괄호가 딱 맞게 나와야 YES가 되괴

)[]( 이런식으로 나오면 "NO"가 출력되면 됩니다.

([)] 이렇게도 안됩니다. => "NO"가 출력되야함

 

이거 그대로 구현해주면 됩니다.

/*
    백준 4949 균형잡힌 세상
    스택사용
* */
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.Stack;

public class Main{
    public static String getValue(String s){
        Stack<Character> stack = new Stack<>();

        for(int i=0; i<s.length(); i++){
            char value = s.charAt(i);
            if(value == '(' || value == '['){
                stack.push(value);
            }

            if(value == ')'){
                if(stack.isEmpty() || stack.peek() != '('){
                    return "no";
                }else{
                    stack.pop();
                }
            }else if( value == ']'){
                if(stack.isEmpty() || stack.peek() != '['){
                    return "no";
                }else{
                    stack.pop();
                }
            }
        }
        if(stack.isEmpty()){
            return "yes";
        }else{
            return "no";
        }
    }

    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while(true){
            String s = br.readLine();
            if(s.equals(".")){
                break;
            }
            System.out.println(getValue(s));
        }
    }
}

 

핵심 로직은 이 부분입니다.

for(int i=0; i<s.length(); i++){
    char value = s.charAt(i);
    if(value == '(' || value == '['){
        stack.push(value);
    }

    if(value == ')'){
        if(stack.isEmpty() || stack.peek() != '('){
            return "no";
        }else{
            stack.pop();
        }
    }else if( value == ']'){
        if(stack.isEmpty() || stack.peek() != '['){
            return "no";
        }else{
            stack.pop();
        }
    }
}

일단 여는 괄호들은 다 스택에 넣어주면 됩니다.

이제 ) , ] 분기시켜줘야 합니다.

둘 다 먼저 스택이 비어있는지 확인해줘야합니다

전에도 말했듯이 스택에 값이 비어있으면 애초에 짝이 맞지 않기 때문에 NO를 출력해줘야해요

+ 조건을 하나 더 추가해야합니다.

위에서 말했듯이 ([)] 이렇게 되면 올바른 괄호가 아닙니다.

그래서 ) 일 떄는 스택에 마지막값이 ( 이 나와야해요

[ 도 마찬가지입니다.

 

여기서 더 궁금하신 점이 있으시면 댓글 남겨주세요

 

감사합니다.

반응형