풀이
[풀이]
처음에는 memoization을 이용해 풀려고 했는데 n의 개수가 적어서 단순 재귀로 풀었다.
열린 괄호를 넣는 경우와 닫는 괄호를 넣는 경우로 나눌 수 있는데, 만약 열린 괄호를 넣게 된다면 사용할 수 있는 열린 괄호의 개수를 1만큼 줄이고 닫힌 괄호의 사용횟수를 1 늘리면 된다.
이후 두 경우의 합을 더하면 현재 열린 괄호와 닫힌 괄호를 사용할 수 있을 때 몇개의 경우의 수가 나오는지 결과를 알 수 있다.
[아이디어 정리]
- 열린 괄호의 개수가 0보다 크면 열린 괄호를 사용하고, 닫힌 괄호의 사용횟수를 1 늘린다.
- 만약 닫힌 괄호의 개수가 0보다 크면 닫힌 괄호를 사용하고 닫힌 괄호의 사용횟수를 1 줄인다.
- 위 과정을 반복해 최종 횟수를 return한다.
Code
#include <string>
#include <vector>
using namespace std;
int calc(int o, int c)
{
int returnA=0;
if (o==0&&c==0)
{
return 1;
}
if (o>0)
{
returnA+=calc(o-1,c+1);
}
if (c>0){
returnA+=calc(o,c-1);
}
return returnA;
}
int solution(int n) {
int answer = 0;
return calc(n,0);
}
Code (DP)
#include <string>
#include <vector>
using namespace std;
vector<vector<int>> DP;
int calc(int o, int c)
{
int returnA=0;
if (DP[o][c]>0)
{
return DP[o][c];
}
if (o>0)
{
returnA+=calc(o-1,c+1);
}
if (c>0){
returnA+=calc(o,c-1);
}
DP[o][c]=returnA;
return returnA;
}
int solution(int n) {
DP=vector<vector<int>>(n+1,vector<int>(n+1,0));
DP[0][0]=1;
int answer = 0;
return calc(n,0);
}
추가할 코드가 많지 않아 memoization을 활용해 더 시간을 줄여서 풀어봤다
반응형
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스/C++] 표현 가능한 이진트리 (0) | 2024.01.15 |
---|---|
[프로그래머스/C++] [1차] 추석 트래픽 (0) | 2024.01.14 |
[프로그래머스/C++] 쿠키 구입 (0) | 2024.01.12 |
[프로그래머스/C++] 아이템 줍기 (0) | 2024.01.11 |
[프로그래머스/C++] 섬 연결하기 (0) | 2024.01.09 |