백준: Class 6 - 1019
</br>
클래스 6 계속
</br>
1019: 책 페이지
https://www.acmicpc.net/problem/1019
#include <bits/stdc++.h>
using namespace std;
int nums[10];
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
for(int i = 0; i < 10; i++){
nums[i] = 0;
}
nums[0] = -1;
for(int i = 0; i <= n % 10; i++){
nums[i]++;
}
int k = n / 10;
if( k > 0 ){
for(int i = 0; i < 10; i++){
nums[i] += k;
}
for(int i = 1; i < k; i++){
int kk = i;
while( kk ){
nums[kk%10] += 10;
kk /= 10;
}
}
while( k ){
nums[k%10] += n%10 + 1;
k /= 10;
}
}
for(int i = 0; i < 10; i++){
cout << nums[i] << ' ';
}
cout << endl;
}
생각하는데 꽤 오래 걸렸다
만약 abcde라는 수라면, abcd와 e로 나누어서 볼 수 있다.
- 일단 0~e까지가 한 번씩 나올 거다. 만약 n이 한 자리 수라면 0이 없으므로, 맨 처음에
nums[0] = -1
로 초기화 해서 본다. - 그럼 이제 abcd만 신경 쓰면 된다.
- abcd는 e+1번 나올 거다. 따라서
nums[a] += e+1
,nums[b] += e+1
, … 해준다. - 그럼 abcd-1은 0~9를 다 가지게 된다. 따라서
nums[i] += abcd-1
을 해 준다. - 이제 abcd-1 자체도 계산해 주자. 0~9를 다 가지므로, 각각 10번씩 나온다.
예를 들어 보면
ex) 12345
1. 12340, 12341, 12342, 12343, 12344, 12345로 0~5까지가 한 번씩 나온다.
2. 이제 1234?만 신경 쓰자.
3. 1에서 봤듯이, 1234?는 5+1번 나온다. 따라서 nums[1] += 6, nums[2] += 6, nums[3] += 6, nums[4] += 6 해준다.
4. 그럼 이제 1233?이 남는다. 0~9가 1233번 나올 거다. 따라서 nums[i] += 1233을 한다.
5. 1?이 10번, 2?이 10번, ..., 1233?이 10번 나온다. 따라서, 각 자리수마다 10씩 더해 준다.
</br>
10억을 https://ideone.com/PbYoEg 에서 돌린 결과 1초 정도 나오는데, 시간 제한이 2초라서 맞기는 했다.
아마 어케 잘 짜면 재귀로 더 빠르게 구하는 게 될 거 같다
</br>
댓글남기기