LeetCode(20) - Valid Parentheses
문제
소괄호, 중괄호, 대괄호로 이루어진 문자열이 주어진다. 이 문자열의 괄호들이 알맞은 pair라면 true를, 아니라면 false를 반환한다.
입력
s = "()[]{}"
출력
true
풀이
- 전형적인 stack문제로, 괄호가 닫힐때 마다 pair를 확인한다.
- 주어진 문자열의 문자들을 순회하면서 문자가 여는괄호면 stack에 쌓고, 닫는 괄호라면, 현재 stack에서 top()과 pair비교 후 pair라면 pop을, 아니면 false를 리턴한다.
코드
Visual studio에서 바로 실행하도록 임의의 main문을 함께 첨부합니다. isValid()
만 보시면 됩니다.
#include<iostream>
#include<string>
#include<stack>
using namespace std;
bool isValid(string s) {
stack<char> st;
for (char c : s) {
if (c == '(' || c == '{' || c == '[') {
st.push(c);
}
else {
if (st.empty()) return false;
if (c == ')' && st.top() == '(') {
st.pop();
continue;
}
else if (c == '}' && st.top() == '{') {
st.pop();
continue;
}
else if (c == ']' && st.top() == '[') {
st.pop();
continue;
}
else {
return false;
}
}
}
return st.empty();
}
int main() {
string s = "()[]{}";
cout << isValid(s);
}
참고
stack
은stack
헤더에 있다.stack
에서 삽입은push()
, 마지막 element 조회는top()
, 마지막 element를 pop은pop()
을 사용한다.- 현재 stack이 비어있는 상황에서 순회하는 문자가 닫은 괄호일 때,
top()
을 먼저 하게되면 오류가 발생한다. 닫는 괄호일 때는empty()
를 먼저 해주자. Parentheses
는 괄호라는 의미이다. 나도 오늘 알았다.