문제 설명

https://www.acmicpc.net/problem/4949

 

4949번: 균형잡힌 세상

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

www.acmicpc.net

 

어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하기

  • 모든 "(" 는 ")"와만 짝을 이루어야 함
  • 모든 "[" 는 "]"와만 짝을 이루어야 함
  • 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼족 괄호가 존재
  • 모든 괄호의 짝은 1 : 1 매칭이 가능함
  • 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 함

 

문제 풀이법

stack을 사용하면 된다

"["이나 "("이 들어오면 stack에 push,

"]"이나 ")"이 들어오면, stack이 비어있는지 확인, stack의 top이 자신의 짝과 맞는지 확인 후에 pop을 한다

만일

  • "]", ")"이 들어왔을 때 stack이 비어있는 경우
  • "]", ")"이 들어왔을 때, stack의 top이 자신의 짝과 다른 경우
  • 문자열을 다 돈 후, stack이 비어있지 않는 경우

이런 경우에는 균형이 잡히지 않았으니 no를 출력한다

 

소스 코드

#include <iostream>
#include <stack>

using namespace std;

int main()
{
    while (1)
    {
        string str;
        getline(cin, str);
        
        
        if (str == ".")
            break;
        
        stack<char> s;
        bool flag = true;
        for (int i = 0; i < str.size(); i++)
        {
            if (str[i] == '[' || str[i] == '(')
                s.push(str[i]);
            else if (str[i] == ']' || str[i] == ')')
            {
                if (s.empty())
                {
                    flag = false;
                    break;
                }
                if (str[i] == ']')
                {
                    if (s.top() != '[')
                    {
                        flag = false;
                        break;
                    }
                    s.pop();
                }
                else if (str[i] == ')')
                {
                    if (s.top() != '(')
                    {
                        flag = false;
                        break;
                    }
                    s.pop();
                }
                
            }
        }
        
        if (!s.empty())
            flag = false;
            
        if (flag == true)
            printf("yes\n");
        else
            printf("no\n");
    }

    return 0;
}

'Algorithm Study' 카테고리의 다른 글

[백준] 9012 괄호  (0) 2023.01.20
[백준] 3986 좋은 단어  (0) 2023.01.19
[백준] 5430 AC  (0) 2023.01.18
[백준] 1021 회전하는 큐  (0) 2023.01.17
[백준] 10866 덱  (0) 2023.01.17
복사했습니다!