균형잡힌 세상 4949

PublicMinsu·2023년 3월 8일
0

문제

접근 방법

문제를 좀 풀어봤다면 알겠지만, 괄호 문제는 스택과 관련된 경우가 많다.
스택으로 최근 왼쪽 괄호를 확인해보고 만약 잘못됐다면 no를 출력하고 끝까지 정상이라면 yes를 출력하면 된다.

코드

#include <iostream>
using namespace std;
char str[101];
bool stack[101];
int start;
bool isBal()
{
    start = -1;
    for (int i = 0; str[i] != '.'; ++i)
    {
        switch (str[i])
        {
        case '(':
            stack[++start] = false;
            break;
        case ')':
            if (start == -1 || stack[start])
                return false;
            --start;
            break;
        case '[':
            stack[++start] = true;
            break;
        case ']':
            if (start == -1 || !stack[start])
                return false;
            --start;
            break;
        default:
            break;
        }
    }
    if (start == -1)
        return true;
    else
        return false;
}
int main()
{
    ios::sync_with_stdio(0), cin.tie(0);
    while (true)
    {
        cin.getline(str, 101, '\n');
        if (str[0] == '.')
            break;
        cout << (isBal() ? "yes" : "no") << "\n";
    }
}

풀이

반복문을 도는 도중에 끝내고 싶다면 별도의 함수로 구현해주는 것이 좋다. 그렇다면 결과가 나온 시점에서 바로 return 해주면 되기 때문이다.
왼쪽에 해당하는 괄호는 검증 도중에는 문제가 있을 리가 없기에 무조건 스택에 집어넣어 주고 오른쪽의 경우 비어있거나 잘못된 짝이면 false를 반환하고 아니면 스택의 크기를 줄여준다. 모든 반복문이 끝났는데 스택이 비어있지 않다면 false를 반환한다.
제출 수가 많은 문제이기에 풀어봤다.

profile
연락 : publicminsu@naver.com

0개의 댓글