홍시홍의 프로그래밍

[2020 카카오 공채] 괄호 변환 본문

알고리즘 문제풀이/카카오

[2020 카카오 공채] 괄호 변환

홍시홍 2020. 8. 8. 16:06

분류 

시뮬레이션

요구사항

균형잡힌 괄호열을 올바른 괄호열로 변환 시켜 준다

풀이

1. 입력이 빈 문자열인 경우, 빈 문자열을 반환합니다.

-> 시작 혹은 dfs 진입시 빈 문자열일 경우 빈 문자열 반환

 

2. 문자열 w를 두 "균형잡힌 괄호 문자열" u, v로 분리합니다. 단, u는 "균형잡힌 괄호 문자열"로 더 이상 분리할 수 없어야 하며, v는 빈 문자열이 될 수 있습니다.

-> 최초의 균형잡힌 문자열 u와 나머지 v로 나누기

 

3. 문자열 u가 "올바른 괄호 문자열" 이라면 문자열 v에 대해 1단계부터 다시 수행합니다.

-> u를 check()하고 v를 재귀 함수로 실행

3-1. 수행한 결과 문자열을 u에 이어 붙인 후 반환합니다.

-> v의 결과를 u에 붙인 후 반환

 

4. 문자열 u가 "올바른 괄호 문자열"이 아니라면 아래 과정을 수행합니다.

-> u를 check()하고 아니라면 아래 과정 수행

4-1. 빈 문자열에 첫 번째 문자로 '('를 붙입니다.

-> 그대로 실행

4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 문자열을 이어 붙입니다.

-> v에 대해서 dfs 실행 후, '('에 붙인다

4-3. ')'를 다시 붙입니다.

-> 그대로 실행

4-4. u의 첫 번째와 마지막 문자를 제거하고, 나머지 문자열의 괄호 방향을 뒤집어서 뒤에 붙입니다.

-> 전체를 뒤집는게 아니라 현재 괄호 방향에 대해서 괄호방향을 바꿔서 뒤에 붙인다

4-5. 생성된 문자열을 반환합니다.

-> 반환

 

문제 그대로 재귀함수를 사용하여 구현

 

#include <string>
#include <vector>
#include <iostream>
#include <queue>
#include <string.h>
#include <algorithm>
#include <deque>
#include <map>
#include <string>
#include <vector>
#include <stack>
using namespace std;
//현재 문자열이 올바른 문자열인지 확인하는 함수
bool check(string s){
	if(s.size()==0){
		return true;
	}
	stack<char> st;
	//'(' 일경우 스택에 넣고, 아닐 경우 pop하거나 리턴
	for(int i=0 ; i <s.size() ; i++){
		if(s[i] =='('){
			st.push(s[i]);
		}
		else{
			if(st.empty()){	//예외 처리
				return false;
			}
			else 
				st.pop();
		}
	}
	//올바른 문자열인지 확인
	if(st.empty())
		return true;
	else 
		return false;
}
string dfs(string s){
	//빈 문자열일 경우 반환
	if(s.size()==0) return s;
	//u, v로 분리하기 최초로 나누어지는 문자열
	int open_cnt=0;
	int close_cnt=0;
	int u_len=0;
	string temp="";
	//u의 길이 찾기
	for(int i=0 ; i <s.size() ; i++){
		if(s[i]=='(')
			open_cnt++;
		else
			close_cnt++;
		if(open_cnt !=0 && close_cnt!=0){
			if(open_cnt==close_cnt)
				break;
		}
	}
	u_len=open_cnt+close_cnt;
	//u와 v 나눈 것으로 행동하기
	string u = s.substr(0,u_len);
	string v = s.substr(u_len,-1);
	//맞을 경우
	if(check(u)){
		return u+dfs(v);
	}
	//아닐 경우
	else{
		temp +='(';
		temp+=dfs(v);
		temp+=')';
		auto pos =u.begin();
		u.erase(pos);
		for(int i=0 ; i <u.size()-1; i++) pos++;
		u.erase(pos);
		string nowtemp;
		for(auto i: u){
			if(i=='('){
				nowtemp+=')';
			}
			else{
				nowtemp+='(';
			}
		}
		temp+=nowtemp;
	}
	return temp;
}

string solution(string p) {
    string answer = "";
	if(p.size()==0){
		return answer=p;
	}
	if(check(p))
		answer=p;
	else
		answer = dfs(p);
	return answer;

}
Comments