문제 링크입니다: http://www.codewars.com/kata/5277c8a221e209d3f6000b56/train/cpp
왼쪽 괄호들을 스택에 넣고 오른쪽과 스택의 탑을 비교하는 것이 핵심이였습니다.
/*
괄호, 중괄호, 대괄호를 문자열로 받고 맞는 순서로 입력받았는지 판별하시오
*/
#include <iostream>
#include <stack>
#include <string>
using namespace std;
bool ifLeft(char ch) //왼쪽 괄호 여부
{
if (ch == '(' || ch == '{' || ch == '[')
return true;
return false;
}
bool match(char left, char right) //왼쪽 괄호와 오른쪽 괄호 동일한지 비교
{
if (left == '('&&right == ')')
return true;
else if (left == '{'&&right == '}')
return true;
else if (left == '['&&right == ']')
return true;
return false;
}
bool valid_braces(std::string braces)
{
stack<char> s;
for (int i = 0; i < braces.length(); i++)
{
if (ifLeft(braces[i])) //왼쪽이면 스택에 넣는다
s.push(braces[i]);
else
{
//오른쪽 괄호가 먼저 왔다는 것은 균형이 맞지 않다는 것
if (s.empty() || !match(s.top(), braces[i])) //해당 괄호와 스택에 있는 괄호가 동일하지 않으면 거짓
return false;
else
s.pop(); //참이라면 판별했으므로 POP
}
}
return true;
}
int main(void)
{
string s = "()";
cout << valid_braces(s) << endl;
s = "([{}])";
cout << valid_braces(s) << endl;
s = "(}";
cout << valid_braces(s) << endl;
s = "[(])";
cout << valid_braces(s) << endl;
s = "[({})](]";
cout << valid_braces(s) << endl;
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > codewars' 카테고리의 다른 글
codewars: Path Finder #2: shortest path (0) | 2018.02.20 |
---|---|
codewars: Some Egyptian fractions (0) | 2018.02.14 |
codewars: Base -2 (0) | 2018.02.07 |
codewars: RGB To Hex Conversion (0) | 2018.02.07 |
codewars: Fun with trees: is perfect (0) | 2018.02.06 |