코딩테스트

[백준] 4949 균형잡힌 세상

yeoul0714 2025. 7. 1. 10:07
#include "bits/stdc++.h"

using namespace std;

stack<char> s;

bool IsBalanced(string input)
{
    while (!s.empty())
    {
        s.pop();
    }

    for (char ch : input)
    {
        if (ch == '(' || ch == '{' || ch == '[' || ch == ')' || ch == '}' || ch == ']')
        {
            if (s.size() == 0)
            {
                s.push(ch);
            }
            else
            {
                if (ch-s.top()==2 || ch - s.top() == 1)
                {
                    s.pop();
                }
                else
                {
                    s.push(ch);
                }
            }
        }
    }




    return s.size()==0;
}

int main() {

    

    vector<string> stringVector;

    string input;
    while (true)
    {
        getline(cin, input);


        stringVector.push_back(input);

        if (input == ".")
        {
            break;
        }
    }

    for(string str : stringVector)
    { 
        if (str == ".")
        {
            continue;
        }

        if (IsBalanced(str))
        {
            cout << "yes"<<endl;
        }
        else
        {
            cout << "no"<<endl;
        }
    }



    return 0;
}

 

이번에도 스택을 이용해 괄호를 검사하는 문제였습니다.

 

이전에 풀었던 괄호검사 문제와의 차이점은 이번엔 중괄호, 대괄호등 종류가 다양해졌다는 점입니다.

 

처음엔 burte force로 모든 케이스에 대해서 if문을 이용해서 검사하려는 아이디어를 가졌지만

 

좀 더 좋은 방법이 있을것이라는 생각에 고민중 ASCII코드를 이용하는 방법을 생각했습니다.

 

ASCII코드 상에서 소괄호의 경우는 차이가 1이고 대괄호, 중괄호의 경우엔 2였습니다.

 

이부분을 이용해 괄호를 명확하게 검사해냈습니다.

 

 

또 추가해볼만한 점은 처음에 풀땐 stack을 전역으로 선언하고 함수에 들어올때마다 while을 이용해 정리해줬는데

 

그냥 함수안에 지역변수로 선언하는 것이 좀 더 좋은 풀이었다고 생각이 듭니다.

'코딩테스트' 카테고리의 다른 글

[백준] 2636 치즈  (0) 2025.07.02
[백준] 14502 연구소  (0) 2025.07.01
[백준] 9012 괄호  (0) 2025.05.30
[백준] 1436 영화감독 숌  (0) 2025.05.30
[백준] 2852 NBA 농구  (0) 2025.05.17