버섯수 앞서는 생각이 필요하다.

 

첫 생각 :

 

d[32001] 을 해줘서.

 

d[0] 부터 시작한다.

 

n은 0 초과 32000 이하를 지켜주면서

=> n+5  n+55 n+555 n+5555 ......

     n-5   n-55  n-555 n-5555 ......

    n*5    n*55  n*555  n*5555 .......       

     n/5   n/55  n/555  n/5555  ......

이것은 num이 1개씩 늘어가고

n+1

n-1 은 num 이 2개 늘어나는 방식으로 d[n +-*/ ??] 를 채워나갔다.

 

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
int d[32001= { 0 };
 
 
void go(int cur_su, int cur_num, int n)
{
    d[cur_su] = cur_num;
    //cout << cur_su << ' ' << cur_num << '\n';
    
 
    int tmp_su = n;
    int tmp_num = cur_num + 1;
 
    while (cur_su + tmp_su <= 32000 && tmp_num <= 8)
    {
        if(d[cur_su + tmp_su] > tmp_num)
            go(cur_su + tmp_su, tmp_num, n);
        tmp_su = tmp_su * 10 + n;
        tmp_num++;
    }
 
    tmp_su = n;
    tmp_num = cur_num + 1;
 
    while (cur_su - tmp_su >= 0 && tmp_num <= 8)
    {
        if (d[cur_su - tmp_su] > tmp_num)
            go(cur_su - tmp_su, tmp_num, n);
        tmp_su = tmp_su * 10 + n;
        tmp_num++;
    }
 
    tmp_su = n;
    tmp_num = cur_num + 1;
    while (cur_su * tmp_su <= 32000 && tmp_num <= 8)
    {
        if (d[cur_su * tmp_su] > tmp_num)
            go(cur_su * tmp_su, tmp_num, n);
        tmp_su = tmp_su * 10 + n;
        tmp_num++;
    }
 
    tmp_su = n;
    tmp_num = cur_num + 1;
    while (cur_su / tmp_su > 0 && tmp_num <= 8)
    {
        if (d[cur_su / tmp_su] > tmp_num)
            go(cur_su / tmp_su, tmp_num, n);
        tmp_su = tmp_su * 10 + n;
        tmp_num++;
    }
 
    tmp_su = cur_su + 1;
    tmp_num = cur_num + 2;
    if(tmp_su <= 32000 && tmp_num <= 8 && d[tmp_su] > tmp_num)
    {
        go(tmp_su, tmp_num, n);
    }
 
    tmp_su = cur_su - 1;
    tmp_num = cur_num + 2;
    if (tmp_su >= 0 && tmp_num <= 8 && d[tmp_su] > tmp_num)
    {
        go(tmp_su, tmp_num, n);
    }
}
 
 
int solution(int n, int num)
{
    for (int i = 0; i <= 32000; i++)
        d[i] = 9;
 
    go(00, n);
    //go(22222, 5, n);
    if (d[num] == 9)
        return -1;
    return d[num];
}
 
 
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
/*
    int n = 8;
    int num;
    for (int i = 0; i < 10; i++)
    {
        cin >> num;
        cout << solution(n, num) << '?';
    }
    */
 
    int n = 8;
    int num = 11095;
    cout << solution(n, num) << '?';
 
 
}
cs

이렇게 말이다.

 

BUT 틀렀다. 반례는 저기 있는 8, 11095 이다.

왜냐면 이것의 답은

88888 / 8 - 8 - 8  인데

d[88888] 을 어떻게 집어넣을것이냐???? 안된다.

 

그러면 9*9*9*9*9*9*9*9  5천만정도인데 데 d[5천만]? 메모리 살려 ㅠㅠ.

 

근데 답은 DFS방식으로 그냥 생각보다 편하게 구하자.

 

 

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
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <vector>
#include <algorithm>
#define pii pair<intint>
using namespace std;
 
int ans = 987654321;
 
void go(int cur_su, int cur_cnt, int n, int num)
{
    if (cur_cnt >= 9)
        return;
 
    if (cur_su == num)
    {
        ans = min(ans, cur_cnt);
        return;
    }
 
 
    int tmp_su = n;
    int tmp_cnt = cur_cnt + 1;
    while (tmp_cnt <= 8)
    {
        go(cur_su + tmp_su, tmp_cnt, n, num);
        go(cur_su - tmp_su, tmp_cnt, n, num);
        go(cur_su * tmp_su, tmp_cnt, n, num);
        go(cur_su / tmp_su, tmp_cnt, n, num);
 
        tmp_su = tmp_su * 10 + n;
        tmp_cnt++;
    }
 
 
 
 
}
 
int solution(int n, int num)
{
    go(00, n, num);
 
    if (ans == 987654321)
        return -1;
    else
        return ans;
}
 
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
 
 
 
 
    int n = 8;
    int num = 11095;
    cout << solution(n, num) << '?';
 
}
 
 
cs

디용? 잠시만 그러면 + 1은 어떻게 처리하는건가??

특히 8891 8은 어떻게 할것이냐

8888 + 8/8 + 8/8 + 8/8 안되는데???

 

 

=> +3 을 꼭 8/8 + 8/8+ 8/8로 나타내지 않아도 된다.

(8+8+8)/8로 절약할수 있다.

즉 (8+8+8)/8+8888 로 8개만에 만들 수 있다.... +1을 미리 해줘서 사칙연산만 사용해도 충분히 전부 탐색이 가능하다.

'뚝배기 터진 문제_programmers' 카테고리의 다른 글

lv3 순위  (0) 2020.09.06
lv3 자물쇠와 열쇠  (0) 2020.09.05
lv2 후보키  (0) 2020.09.05
lv2 가장 큰 정사각형 찾기  (0) 2020.09.05
lv2 조이스틱  (0) 2020.08.28

+ Recent posts