PS

BOJ 7585 : Brackets

lickelon 2025. 2. 14. 16:52
  • 문제 링크 : boj.kr/7585
  • 난이도 : S4
  • 태그 : 문자열, 스택

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    while(true) {
        string s;
        getline(cin, s);
        if(s[0] == '#') break;

        stack<int> _st;
        bool flag = true;
        for(int i = 0; i < s.length(); i++) {
            int bnum = 0;
            switch(s[i]) {
                case '(':
                    bnum++;
                case '{':
                    bnum++;
                case '[':
                    bnum++;
                    _st.push(bnum);
                    break;
                
                case ')':
                    bnum++;
                case '}':
                    bnum++;
                case ']':
                    bnum++;
                    if(_st.empty() || _st.top() != bnum) flag = false;
                    else _st.pop();
                    break;

                default:
                    break;
            }
        }
        if(!_st.empty()) flag = false;
        cout << (flag ? "Legal" : "Illegal") << "\n";
    }

    return 0;
}

풀이

괄호 문자열이 올바른지 확인하는 문제이다.

여는 괄호를 만났을 때 괄호의 종류를 스택에 저장하고, 닫는 괄호를 만났을 때 스택의 가장 앞에 있는 괄호의 종류와 같은지 확인하고 pop한다.

모든 괄호 쌍이 서로 맞고, 스택에 남은 괄호가 없다면 올바른 괄호 문자열이다.

괄호의 종류를 스택에 저장할 때, switch-case문의 특징을 이용하면 코드를 압축할 수 있다.

728x90

'PS' 카테고리의 다른 글

BOJ 2090 : 조화평균  (1) 2025.02.16
BOJ 2312 : 수 복원하기  (0) 2025.02.15
BOJ 20118 : 호반우가 길을 건너간 이유  (0) 2025.02.13
BOJ 1516 : 게임 개발  (0) 2025.02.12
BOJ 11645 : I’ve Been Everywhere, Man  (0) 2025.02.11