1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include<iostream> #include<string> #include<vector> #include<stack> #include<cassert> #include<algorithm> #include<queue> using namespace std; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int cases; cin >> cases; assert(cases <= 100); while (cases--) { string s; stack<char> bracket; cin >> s; for (int i = 0; i < s.size(); i++) { if (s[i] == '(' || s[i] == '[' || s[i] == '{') { bracket.push(s[i]);continue;} if (!bracket.empty() && (bracket.top() == '('&&s[i] == ')')) { bracket.pop(); continue;} if (!bracket.empty() && (bracket.top() == '{'&&s[i] == '}')) { bracket.pop();continue;} if (!bracket.empty() && (bracket.top() == '['&&s[i] == ']')) { bracket.pop();continue;} if (bracket.empty() && (s[i] == ')' || s[i] == '}' || s[i] == ']')) { bracket.push(s[i]); break; } } if (bracket.empty()) cout << "YES" << endl; else cout << "NO" << endl; while (!bracket.empty()) bracket.pop(); } } | cs |
문제 출처:https://algospot.com/judge/problem/read/BRACKETS2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include<iostream> #include<string> #include<vector> #include<stack> #include<cassert> #include<algorithm> #include<queue> using namespace std; bool wellMatched(const string& formula) { //여는 괄호문자들과 닫는 괄호 문자들 const string opening("({["), closing(")}]"); //이미 열린 괄호들을 순서대로 담는 스택 stack<char> openStack; for (int i = 0; i < formula.size(); i++) { if (opening.find(formula[i]) != -1) //여는 괄호라면 무조건 스택에 집어넣는다. openStack.push(formula[i]); else { //이 외의 경우 스택 맨 위의 문자와 맞춰보자. //스택이 비어 있는 경우에는 실패 if (openStack.empty()) return false; //서로 짝이 맞지 않아도 실패 if (opening.find(openStack.top()) != closing.find(formula[i])) return false; //짝을 맞춘 괄호는 스택에서 뺀다. openStack.pop(); } } return openStack.empty(); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int cases; cin >> cases; assert(cases <= 100); while (cases--) { string s; stack<char> bracket; cin >> s; if (wellMatched(s)) cout << "YES" << endl; else cout << "NO" << endl; } } | cs |
이 소스코드는 책에 나와있는 풀이이다.
이 문제에서 주의해야 될 점 두가지는
1. 전부 다 잘 처리하고 마지막에 열린 괄호가 남아 있는지 확인하는것.
2. 스택에서 여는 괄호를 꺼내려고 하는데 스택이 비어 있는 경우.
내 코드에 비교해서 체계적이고 깔끔한 느낌이 드는 것 같다. find함수를 이용해서 푸는 방법도 염두에 둬야겠다.
두 풀이의 수행속도는 8ms로 동일하다.
'알고리즘 > 알고리즘 문제 해결전략(종만북)' 카테고리의 다른 글
21장 트리 순회 순서 변경 TRAVERSAL (0) | 2018.12.28 |
---|---|
19장 외계 신호 분석 ITES (0) | 2018.12.26 |
18장 조세푸스 문제 JOSEPHUS (0) | 2018.12.26 |
7장 쿼드 트리(QUADTREE) (0) | 2018.12.25 |
8장 외발뛰기 (JUMPGAME) (0) | 2018.12.23 |