굥뷰를 햡시댜
[2020 Kakao Blind] 괄호 변환 (C++) 본문
https://programmers.co.kr/learn/courses/30/lessons/60058
코딩테스트 연습 - 괄호 변환 | 프로그래머스
카카오에 신입 개발자로 입사한 콘은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를 컴파일하여 로그를 보니 대부분 소스 코드 내 작성된 괄호가 개수는 맞지만 짝이 맞지 않은 형태로 작성되어 오류가 나는 것을 알게 되었습니다. 수정해야 할 소스 파일이 너무 많아서 고민하던 콘은 소스 코드에 작성된 모든 괄호를 뽑아서 올바른 순서대로 배치된 괄호 문자열을 알려주는
programmers.co.kr
별다른 알고리즘 없이 재귀와 문자열만 사용할 줄 알면 풀 수 있는 문제 입니다.
문제에서는 다음과 같은 것들을 요구하고 있습니다.
1. 올바른 괄호 문자열(빈 문자열 포함)인지 확인할 수 있는가?
2. 균형 잡힌 두 문자열을 구할 수 있는가?
3. 위의 2가지 과정을 재귀로 구현할 수 있는가?
이를 위해 저는 implement_string이라는 함수를 하나 만들었습니다.
이 함수는 문제에서 요구하는 것들을 만족시키면서 재귀적으로 작동합니다.
impelment_string 함수 안에서 문제에서 요구하는 것들을 순서대로 작성하기만 하면 문제를 풀 수 있습니다.
아래는 코드 입니다.
#include <string>
#include <vector>
using namespace std;
bool check_string(string str) {
int cnt = 0;
for (int i = 0; i < str.length(); i++) {
if (str[i] == '(') cnt += 1;
else if (str[i] == ')') cnt -= 1;
if (cnt < 0) return false;
}
if (cnt == 0) return true;
else return false;
}
string implement_string(string str) {
//올바른 문자열이거나 빈 문자열이면 그대로 반환
if (check_string(str)) {
return str;
}
//올바른 문자열이 아닐 경우 균형잡힌 문자열로 분리
string u, v;
int open_cnt = 0, close_cnt = 0;
int i;
for (i = 0; i < str.length(); i++) {
if (str[i] == '(') open_cnt += 1;
else if (str[i] == ')') close_cnt += 1;
if (open_cnt == close_cnt) {
break;
}
}
for (int j = 0; j <= i; j++) u += str[j];
for (int j = i + 1; j < str.length(); j++) v += str[j];
if (check_string(u)) {
return u + implement_string(v);
}
else {
string empty_str;
empty_str += "(";
empty_str += implement_string(v);
empty_str += ")";
for (int j = 0; j < u.length(); j++) {
if (j == 0 || j == u.length() - 1) continue;
if (u[j] == '(') empty_str += ")";
else if (u[j] == ')') empty_str += "(";
}
return empty_str;
}
}
string solution(string p) {
string answer = implement_string(p);
return answer;
}
'알고리즘 문제 풀이 > 2020 Kakao Blind 문제 풀이' 카테고리의 다른 글
[2020 Kakao Blind] 문자열 압축 (C++, python3) (0) | 2019.10.04 |
---|
Comments