본문 바로가기
  • 실행력이 모든걸 결정한다
Algorithm/DFS

[DFS] 괄호 변환 - 2020 카카오 블라인드 채용

by 김코더 김주역 2022. 3. 13.
반응형

단순히 주어진 조건대로 코딩하면 되는 문제이기 때문에 소스 코드에 사용된 함수만 설명하였다.

 

bcheck 함수

괄호 문자열에는 균형잡히지 않은 괄호 문자열, 균형잡힌 괄호 문자열, 올바른 괄호 문자열 3가지 경우가 있는데, 어느 경우인지를 판단하여 반환하는 함수다.

괄호 문자열을 첫 문자부터 검사하면서 누적 '('과 ')'의 수를 카운트 하여 어느 케이스의 문자열인지 판단할 수 있다.

- 균형잡히지 않은 괄호 문자열 : 누적 ')'의 개수가 누적 '(' 개수보다 큰 순간이 있는 경우

- 균형잡힌 괄호 문자열 : 총 ')'의 개수와 총 '(' 개수가 같은 경우

- 올바른 괄호 문자열 : 총 ')'의 개수와 총 '(' 개수가 같고, 누적 ')'의 개수가 누적 '(' 개수보다 큰 순간이 없었을 경우

 

dfs 함수

아래의 과정을 작성한 함수다.

2번의 경우에는 길이가 n인 문자열 w를 (u, v)로 분리한다고 했을 때, 분리된 문자열 u가 균형잡힌 괄호 문자열이 나올 때까지 (2, n-2), (4, n-4), (6, n-6), ..., (n-2, 2) 순서로 나눠보는 방법을 이용했다.

1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다. 
2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다. 
3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다. 
  3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다. 
4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다. 
  4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다. 
  4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다. 
  4-3. ')'를 다시 붙입니다. 
  4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다. 
  4-5. 생성된 문자열을 반환합니다.

 

 

소스 코드

#include <string>
#include <vector>
using namespace std;

// 0: 균형잡히지 않은 괄호 문자열, 1: 균형잡힌 괄호 문자열, 2: 올바른 괄호 문자열 반환
int bcheck(string s){
    int open=0;
    int close=0;
    bool b=true;
    for(int i=0;i<s.length();i++){
        if(s[i]=='(') open++;
        else close++;
        if(open<close) b=false;
    }
    if(open!=close) return 0;
    if(b) return 2;
    else return 1;
}

string dfs(string s){
    if(s.length()==0) return "";
    string r=""; string u=""; string v="";
    int slen=s.length();
    for(int i=2;i<=slen;i+=2){
        if(bcheck(s.substr(0, i))){
            u=s.substr(0, i);
            v=s.substr(i);
            break;
        }
    }
    if(bcheck(u)==2){
        r+=u;
        r+=dfs(v);
    }
    else{
        r+='(';
        r+=dfs(v);
        r+=')';
        for(int i=1;i<u.length()-1;i++){
            if(u[i]=='(') r+=')';
            else r+='(';
        }
    }
    return r;
}

string solution(string p) {
    return dfs(p);
}

 

테스트케이스 25개 모두 정답

반응형

댓글