- 문제 링크 : 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 |