문제 링크 : programmers.co.kr/learn/courses/30/lessons/60058
<전체적 알고리즘>
문제 자체에 알고리즘이 완벽하게 주어져 있다. 알고리즘이 주어져있지 않았다면 분명히 어려운 문제겠지만 문제에 알고리즘이 자세히 설명되어있기에 그냥 고민할 것 없이 그대로 구현하면 된다. 알고리즘이 그대로 적혀있기에 굳이 설명할 것 없이 넘어가겠다.
<올바른 괄호 문자열 확인 알고리즘>
전체적인 알고리즘은 그대로 구현하면 되지만 올바른 문자열인지 아닌지 판별하는 함수는 생각해 보아야 한다.
올바른 괄호 문자열 판별은 단순히 스택을 이용해서 알 수 있다. 열린 괄호일 때 stack에 넣어주고 닫힌 괄호일 때 stack에서 빼주면서 쌍을 만들어 준다. 모두 쌍이 만들어지면 올바른 괄호 문자열이다.
(코드에서는 stack을 이용하여 구현하였지만 사실 stack을 이용할 필요도 없다. 단순히 변수 count를 이용하여 열린괄호면 count++ 닫힌 괄호면 count--하며 변수하나만으로도 간단히 구현이 가능하지만 좀 더 직관적으로 설명하기 위해 stack을 이용했다.)
<전체 코드>
#include<iostream>
#include<stack>
#include<string>
using namespace std;
bool iscorrect(string u) // 올바른 괄호 문자열인지 확인, 맞는 괄호 짝을 찾아줘야함
{
stack<int> s;
for (int i = 0; i < u.size(); i++)
{
if (u[i] == '(')s.push(u[i]);
else
{
if (s.empty())return false; //닫힌괄호가 나왔는데 스택이 비어있으면 쌍이없음,,false
s.pop();
}
}
if (!s.empty())return false; //짝을 다 찾아줬는데 아직 남아있는 괄호있으면 false,,
return true;
}
string make_correct(string p) //올바른 괄호 문자열 만드는 함수
{
if (p.size() == 0)return "";
string u = "";
string v = "";
int balanced = 0;
int i = 0;
for (; i < p.size(); i++) //u 만들어주기
{
u += p[i];
if (p[i] == '(')balanced++;
else balanced--;
if (balanced == 0)break; // balanced가 0이되면 균형잡힌 괄호 문자열 완성
}
i++;
for (; i < p.size(); i++) // v만들어주기
{
v += p[i];
}
if (!iscorrect(u)) //u가 올바른 괄호 문자열이 아니라면
{
string result = "(";
result+= make_correct(v); //나머지 v에 대해 올바른 괄호 문자열 만들기
result += ")";
string tmp = u.substr(1, u.size() - 2); //앞뒤 문자떼어버리기
for (int i = 0; i < tmp.size() ;i++) //문자들 뒤집기
{
if (tmp[i] == '(')tmp[i] = ')';
else tmp[i] = '(';
}
return result + tmp; //반환
}
else
{
string result=make_correct(v); //v에 대해서 올바른 괄호 문자열 만들기
return u + result; // u랑 합쳐서 반환
}
}
string solution(string p) {
string answer = make_correct(p);
return answer;
}
궁금하신 점은 댓글에 남겨주시면 답변드리겠습니다.
반응형
'프로그래머스 코딩 문제 > 카카오 기출문제' 카테고리의 다른 글
[프로그래머스] 오픈채팅방 (2019 KAKAO BLIND RECRUITMENT) (0) | 2020.09.02 |
---|---|
[프로그래머스] 프렌즈4블록 (2018 KAKAO BLIND RECRUITMENT) (0) | 2020.08.31 |
[프로그래머스] 단체사진 찍기 (2017 카카오코드 본선) (level 3) (0) | 2020.08.28 |
[프로그래머스] 보행자 천국 (2017 카카오코드 예선) (level 3) (0) | 2020.08.27 |
[프로그래머스] 카카오 프렌즈 컬러링북 (2017 카카오코드 예선) (0) | 2020.08.26 |