본문 바로가기
코딩 테스트

[프로그래머스] 괄호변환 (C++)

by zoodi 2021. 3. 2.
728x90

🔮문제

programmers.co.kr/learn/courses/30/lessons/60058

 

코딩테스트 연습 - 괄호 변환

카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를

programmers.co.kr

🔮풀이

1. P가 빈 문자열인 경우, 빈 문자열 "" 반환

2. 올바른 문자열인 경우, 입력 문자열 반환

3. 균형잡힌 문자열인 경우

 3-1. u + v로 분리 (u : 균형, 분리x , v : 빈 문자열 ok)

 3-2. u가 올바른 문자열인 경우, u + v(1번부터 재귀) 반환

 3-3. u가 올바른 문자열이 아닌 경우, 문제의 4번 과정 수행 (recursive 함수 , u 문자열 첫째 마지막 문자 삭제후 뒤집기)

 

이 문제 풀이의 관건은 2가지 함수를 설정하는 것이다.

1) 올바른 문자열인지 확인하는 함수

2) u + v로 분할하는 recursive 함수

 

🔮코드

#include <string>
#include <vector>
#include <stack>
#include <algorithm>
#include <iostream>

/*
개수만 같은 경우 -> 균형잡힌
개수 + 짝이 모두 맞을 경우 -> 올바른
올바른 문자열 결과 반환

-균형잡힌 문자열일 경우
1. 빈 문자 -> 빈 문자 반환
2. w = u + v 로 분리 (u: 균형, 분리X, v: 빈문자열 ok)
2-1. u가 올바른 문자열이면 v를 2번 과정 수행
2-2. u가 올바른 문자열 아니면 4번 과정 수행

*/
using namespace std;

bool isRight(string p)
{
    stack<char> st;
    
    for(int i=0; i<p.length(); i++){
        if(p[i] == '('){
            st.push(p[i]);
        }
        else{
            if(!st.empty()){
                st.pop();
            }
        }
    }
    if(st.empty())
        return true;
    else
        return false;
}

string func(string p){
    //1. 빈 문자열인 경우 빈 문자열 반환
    if(p == "")
        return "";
    string u = ""; string v = "";
    int left = 0; int right = 0;
    //2. 균형잡힌 문자열이 되면 u, v 로 분리
    int size = p.size();
    for(int i=0; i< size; i++){
        if(p[i] == '('){
            left++;
        }
        else
            right++;
        if(left == right){
            u = p.substr(0, i+1);
            v = p.substr(i+1);
            break;
        }
    }
    //3. u가 올바른 문자열이면 v에 대해 1부터 재귀 수행
    if(isRight(u)){
        return u + func(v);
    }
    //4. u가 올바른 문자열이 아니면
    else{
        // 4-1 ~ 4-3
        string tmp = '(' + func(v) + ')'; 
        // 4-4
        u = u.substr(1, u.size()-2); 
        for(int i=0; i<u.size(); i++){
            if(u[i] == '('){
                tmp += ')';
            }
            else
                tmp += '(';
        }
        return tmp;
    }
}

string solution(string p) {
    if(p == "")
        return "";
    return func(p);
}
728x90

'코딩 테스트' 카테고리의 다른 글

[Codility] Lesson8. Dominator  (0) 2021.03.03
[Codility] Lesson4. Brackets  (0) 2021.03.03
[Codility] Lesson5.CountDiv (C++)  (0) 2021.02.23
[Codility] Lesson4. FrogRiverone (C++)  (0) 2021.02.23
[Codility] Lesson3. TapeEquilibrium (C++)  (0) 2021.02.23

댓글