강의로 돌아가기
맘마미밈

풀이 및 해설

풀이 및 해설

작성중인 코드―Solution.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.util.*;
class Solution {
    public int solution(int n) {
        /*
            n을 구성하는데 필요한 *와 +의 숫자를 먼저 구해야 한다.
            n은 3^(* 개수) 보다 크고 3^(* 개수 +1)보다 작아야 한다.
            즉 *의 개수는 log(n)/log3 이다. 
            +의 개수는 *의 개수의 2배이다.
        */ 

        // s= *의 개수
        int s=(int)(Math.log(n)/Math.log(3));
        /*
            n의 맨 뒤 두자리는 무조건 ++가 온다. 
            그 이후에 맨 뒤에 올 수 있는것은 + 또는 * 이다.
            맨 뒤의 +또는 *를 삭제해가며 n을 점차적으로 줄여나가보자. 
            이때 점차 줄어든 n을 k라 한다.

            k%3==0 이면, 맨 뒤의 *를 삭제하고 k/3을 구한다.
            k%3!=0 이면, 맨 뒤의 +를 삭제하고 k-1을 구한다. 

            이때, **++++++은 가능하지만, ++++++**은 불가능하다. 
            삭제된 *개수는 삭제된 +의 개수의 2배를 초과하면 안된다. 
            (*개수 *2 <= +개수)를 만족해야 한다.           
        */
        return run(n-2, s, s*2-2, 0, 2);
    }
    // s는 *의 수
    // p는 +의 수
    // cut_s는 줄어든 *의 수
    // cut_p는 줄어든 +의 수
    int run(int n, int s, int p, int cut_s, int cut_p){
        int a=0;
        int b=0;
        if(cut_s *2 >cut_p) // **++++++는 가능하지만 ++++++**은 불가능하도록 조건 구성
            return 0;
        if(n<3){
            return 0;
        }
        else if(n==3 && s==1 && p==0){
            return 1;
        }
        if(p>0){ // 맨 뒤에 p를 하나 지우고(p-1) n-1을 구한다. p를 하나 지웠기 때문에 cut_p는 1 증가한다.
            a=run(n-1, s, p-1, cut_s, cut_p+1);
        }
        if(n%3==0 && s>0){ // 맨 뒤에 *를 하나 지우고(s-1) n/3을 구한다. *를 하나 지웠기 때문에 cut_s는 1 증가한다.
            b=run(n/3, s-1, p, cut_s+1, cut_p);
        }
        return a+b;
    }
}
0 개의 답변
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다.