오늘의 알고리즘

[C++]2017 카카오코드 예선 4단 고음(프로그래머스 4레벨)

하늘하늘 . 2022. 3. 19. 22:46
#include <cmath>
#include <stdio.h>
 
// 앞에서 말고 뒤에서 부터 시작해야한다.
int findCase(int n, int iPlus) 
{
    int result = 0;
 
    // 아예 도달할 수 없는 경우 리턴 0 
    if (n < 1 || 2 * log(n) / log(3) < iPlus)
        return 0;
 
    else if (n == 3 && iPlus == 2)
        return 1;
 
    else if (n == 3 && iPlus == 3)
        return 0;
 
    // 3으로 나눠지고 Plus가 2이상이면 *를 쓰고 +를 2개 제거
    if (n % 3 == 0 && iPlus >= 2)
        result += findCase(n / 3, iPlus - 2);
 
    // 나눠지지 않는다면 +를 쓴다.
    result += findCase(n - 1, iPlus + 1);
 
    return result;
}
 
int solution(int n) 
{
    int answer = 0;
    return findCase(n - 2, 2);
}

1. 곱하면서 시작하는 게 아니라 빼면서 시작해야한다

2. 도달하지 못할 경우를 구해야한다.