728x90

 0. [C++] Kick Start 


https://codingcompetitions.withgoogle.com/kickstart/round/0000000000050ff4/0000000000051183


 1. 풀이


조금 지저분한 코드가 나오긴 하였는데, 이 문제를 풀면서 포인트는 입력을 9진수라고 생각하고 입력을 받는 것이었다.


허나, 이것으로는 아직 부족한데, 바로 9의 배수도 고려를 해주어야 한다는 것이다.


이 수들을 공책에 써서 이리저리 굴려보니 9진수를 기준으로 9개씩 쌍을 나누어보면 1개의 9의 배수가 포함되는 것을 볼 수 있다.

이때, 이 배열에서 9의 배수 앞인지 뒤인지 판단은 ull n,m을 활용하였고, 1씩 더하여 9가 되는것이 빠른지 9의 배수가 더 빠르게 되는지 확인을 통해 체크하였다.


허나, 이 규칙은 1~8 구간에서 만족하질 못하는데, 이는 따로 예외처리를 해주어 만족시켜주었다.


이제 마지막으로 9진수로 들어왔다고 가정한 입력을 10진수로 변환을 하고, 그 수를 a,b로 주었고, 이 수 사이에 들어있는 9의 배수의 개수를 n,m이라 해주었다.


이제 return으로 (b-m) - (a-n) + 1을 해주면 완성!



 2. 소스코드


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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
 
typedef unsigned long long ull;
using namespace std;
 
bool stringMODNine(const string& S, int k) {
    int t = 0;
    for (int i = 0; i < S.size(); i++) {
        t += S[i] - 48;
    }
    t += k;
    if (t % 9 == 0)
        return true;
    else
        return false;
}
 
ull solve(const string& F, const string& L) {
 
 
    //10진수로 변환하자.
    ull a = 0, b = 0, c = 0;
    ull k = 1;
    for (int i = 1; i <= F.size(); i++) {
        a += (F[F.size() - i] - 48* k;
        k *= 9;
    }
    k = 1;
    for (int i = 1; i <= L.size(); i++) {
        b += (L[L.size() - i] - 48* k;
        k *= 9;
    }
    //사이에 중복되어있는 9의 배수의 개수를 찾자.(9개마다 1개가 포함)
    int arr[9];
    for (int i = 0; i < 9; i++) {
        arr[i] = i;
    }
    ull n = a, m = b;
    
    n /= 9;
    char x = F[F.size() - 1];
    bool flag = false;
    for (int i = 0; i < 9; i++) {
        
        if ((x - 48== 9) {
            break;
        }
        if (stringMODNine(F, i)) {
            flag = true;
            break;
        }
        x++;
    }
    if (flag)
        n--;
    if (a == 8)
        n = 0;
        
    m /= 9;
    x = L[L.size() - 1];
    flag = false;
    for (int i = 0; i < 9; i++) {
        
        if ((x - 48== 9) {
            break;
        }
        if (stringMODNine(L, i)) {
            flag = true;
            break;
        }
        x++;
    }
    if (flag)
        m--;
    if (b == 8)
        m = 0;
 
    
    //cout << a << " " << b << endl;
    //cout << n << " " << m << endl;
 
    return (b - m) - (a - n) + 1;
}
 
 
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int T;
    string F, L;
    
    cin >> T;
    for (int i = 1; i <= T; i++) {
        cin >> F >> L;
 
        cout << "Case #" << i << ": " << solve(F,L) << "\n";
    }
}
 
 
//void printNine(int N) {
//    int a = 9;
//    int count = 0;
//    for (int i = 1; i < N; i++) {
//        
//        if (includeNine(a)) {
//            count++;
//            cout << i << " : " << a << "\t\t" << count <<endl;
//        }
//            
//        a += 9;
//    }
//}
 
//
//ull seed[20];
//ull seedSum[20];
//
//bool includeNine(const ull& N) {
//    ull copy = N;
//    while (copy) {
//        int a = copy % 10;
//        if (a == 9)
//            return true;
//        copy /= 10;
//    }
//    return false;
//}
//
//ull nineFilter(const string& F, const string& L) {
//    ull count = 0;
//    ull a = atoi(F.c_str());
//    ull b = atoi(L.c_str());
//    ull i = a;
//    int temp = i % 9;
//    i += (9 - temp);
//    while (1) {
//        if (i > b)
//            break;
//        if (!includeNine(i))
//            count++;
//        i += 9;
//    }
//    return count;
//}
cs


 3. 참고




질문이나 지적 있으시면 댓글로 남겨주세요~

도움 되셨으면 하트 꾹!




+ Recent posts