173. 괄호 변환

아현·2021년 7월 9일
0

Algorithm

목록 보기
178/400
post-thumbnail
post-custom-banner

프로그래머스




1. 구현

def balanced_index(p): #균형 괄호 문자열의 인덱스 반환
    count = 0
    for i in range(len(p)):
        if p[i] == '(':
            count += 1
        else:
            count -= 1
        if count == 0:
            return i
        
def check_proper(p): #올바른 괄호 문자열인지 판단
    count = 0
    for i in p:
        if i == '(':
            count += 1
        else:
            if count == 0: #쌍이 맞지 않는 경우 False 반환
                return False
            count -= 1
    return True

def solution(p):
    answer = ''
    if p == '': #입력이 빈 문자열이면 빈 문자열 반환
        return answer
    index = balanced_index(p)
    #균형잡힌 괄호 문자열이면 u, v로 분리
    u = p[:index + 1]
    v = p[index + 1:]
    #올바른 괄호 문자열이면, v에 대해 함수를 수행한 결과를 붙여 반환
    if check_proper(u):
        answer = u + solution(v) #v에 대해 1단계부터 수행
    else: #u가 올바른 문자열이 아니라면
        answer = '(' #빈 문자열에 첫 번째 문자로'(' 붙이기
        answer += solution(v) #재귀
        answer += ')' #')' 다시 붙이기
        u = list(u[1:-1]) #첫번째와 마지막 문자를 제거
        for i in range(len(u)): # 뒤집어서 붙이기
            if u[i] == '(':
                u[i] = ')'
            else:
                u[i] = '('
        answer += ''.join(u)
    return answer



2. C++


#include <bits/stdc++.h>

using namespace std;

// "균형잡힌 괄호 문자열"의 인덱스 반환
int balancedIndex(string p) {
    int count = 0; // 왼쪽 괄호의 개수
    for (int i = 0; i < p.size(); i++) {
        if (p[i] == '(') count += 1;
        else count -= 1;
        if (count == 0) return i;
    }
    return -1;
}

// "올바른 괄호 문자열"인지 판단
bool checkProper(string p) {
    int count = 0; // 왼쪽 괄호의 개수
    for (int i = 0; i < p.size(); i++) {
        if (p[i] == '(') count += 1;
        else {
            if (count == 0) { // 쌍이 맞지 않는 경우에 false 반환
                return false;
            }
            count -= 1;
        }
    }
    return true; // 쌍이 맞는 경우에 true 반환
}

string solution(string p) {
    string answer = "";
    if (p == "") return answer;
    int index = balancedIndex(p);
    string u = p.substr(0, index + 1);
    string v = p.substr(index + 1);
    // "올바른 괄호 문자열"이면, v에 대해 함수를 수행한 결과를 붙여 반환
    if (checkProper(u)) {
        answer = u + solution(v);
    }
    // "올바른 괄호 문자열"이 아니라면 아래의 과정을 수행
    else {
        answer = "(";
        answer += solution(v);
        answer += ")";
        u = u.substr(1, u.size() - 2); // 첫 번째와 마지막 문자를 제거
        for (int i = 0; i < u.size(); i++) {
            if (u[i] == '(') u[i] = ')';
            else u[i] = '(';
        }
        answer += u;
    }
    return answer;
}

profile
For the sake of someone who studies computer science
post-custom-banner

0개의 댓글