[프로그래머스 C++] 괄호 회전하기

 

https://school.programmers.co.kr/learn/courses/30/lessons/76502

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

 

해결방안

 

구현

문자열

스택 Stack

큐, 데큐 Queue, Deque

 


 

 

코드

 

#include <vector>
#include <string>
#include <deque>
#include <stack>
using namespace std;
bool isMatch(char a, char b)
{
if (a == '[' && b == ']') return true;
if (a == '{' && b == '}') return true;
if (a == '(' && b == ')') return true;
return false;
}
int solution(string s) {
int answer = 0;
int n = s.size();
deque<char> DQ(s.begin(), s.end());
while(n--)
{
stack<char> st;
for (char bracket : DQ)
{
if (bracket == '[' || bracket == '{' || bracket == '(')
st.push(bracket);
else
{
if(st.empty() || isMatch(st.top(), bracket) == false)
{
st.push(bracket);
break;
}
st.pop();
}
}
if (st.empty()) answer++;
char temp = DQ.front();
DQ.pop_front();
DQ.push_back(temp);
}
return answer;
}

 

 

 


 

코드 및 해설

 

#include <vector>
#include <string>
#include <deque>
#include <stack>
using namespace std;
// 두 개의 입력된 괄호가 서로 짝을 이루는지를 확인하는 함수
// (, {, [와 ), }, ]가 적절히 짝을 이루는지 확인
bool isMatch(char a, char b)
{
if (a == '[' && b == ']') return true;
if (a == '{' && b == '}') return true;
if (a == '(' && b == ')') return true;
return false;
}
int solution(string s) {
int answer = 0; // 올바른 괄호 문자열의 개수를 저장할 변수
int n = s.size(); // 주어진 문자열의 길이
// 왼쪽 회전을 용이하게 하기위해 deque 사용.
deque<char> DQ(s.begin(), s.end()); //문자열 s를 deque에 넣습니다.
while(n--)
{
stack<char> st; //괄호 검사에 사용할 스택
//현재의 문자열이 올바른 괄호 문자열인지 확인하기 위해 st을 이용한다.
for (char bracket : DQ) //DQ의 요소들을 순회
{
if (bracket == '[' || bracket == '{' || bracket == '(')
st.push(bracket); //여는 괄호면 스택에 푸시
else
{ // st가 비워져있고 다음 괄호가 ']', '}', ')' 라면
// st의 맨 위 원소와 다음 괄호가 같지 않다면
if(st.empty() || isMatch(st.top(), bracket) == false)
{
st.push(bracket); // 괄호를 st에 넣고
break; // 종료
}
// 위의 조건이 아니라면
// =st.top의 괄호와 대응되는 괄호가 있으면 st에서 꺼낸다.
st.pop();
}
}
// 여는 괄호일 경우 스택에 푸시하고, 닫는 괄호일 경우 가장 최근에 푸시된 여는 괄호와 비교하여 짝이 맞으면 스택에서 제거.
// 만약 짝이 맞지 않거나 스택이 비어있으면 닫힌 괄호를 스택에 넣고 반복문을 종료.
if (st.empty()) answer++; //stack이 비었으면 올바른 괄호 문자열이다.
//왼쪽으로 회전
char temp = DQ.front();
DQ.pop_front();
DQ.push_back(temp);
}
return answer;
}