최대 1 분 소요

올바른괄호의갯수 (프로그래머스 Level 4)

https://school.programmers.co.kr/learn/courses/30/lessons/12929

수학적 지식이 필요한 ‘조합’ 쪽 문제이지 않을까 싶었으나
제한사항의 n이 약 14 정도이기에
백트래킹 방식으로도 풀 수 있지 않을까 싶었다

set 을 통해 완성된 조합을 저장시키고
dfs와 백트래킹을 통해 이전 단계로 돌아가는 방식을 적용시켰다

문제의 조건인 ‘괄호’는 결국
‘)’ 괄호가 ‘(‘ 의 수보다 많아지면 안되기에
후방 괄호쪽의 if문에 조건을 하나 추가하여 사용하였다

  • 처음에는 set을 통해 ‘조합’을 찾는 방식을 이용하였는데
    단순히 answer++를 사용하더라도 충분히 정답을 찾아낼 수 있었다
    (더 빨리 통과된 것은 덤)

Code

#include <string>
#include <vector>

using namespace std;

void dfs(int& answer, string& temp, int fc, int rc)
{
    // 종료 조건 (fc 와 rc가 모두 0)
    if (fc == 0 && rc == 0)
    {
        answer++;
        return;
    }
    
    // 백트래킹
    // 전방 괄호 추가
    if(fc > 0)
    {
        temp.push_back('(');
        dfs(answer, temp, fc - 1, rc);
        temp.pop_back();
    }

    // 후방 괄호 추가
    if(rc > 0 && rc > fc)
    {
        temp.push_back(')');
        dfs(answer, temp, fc, rc - 1);
        temp.pop_back();
    }
}

int solution(int n) {
    string temp = "";
    int answer = 0;
    
    dfs(answer, temp, n, n);

    return answer;
}

댓글남기기