알고리즘/baekjoon
[BOJ] 1748번: 수 이어 쓰기 1
qkrgusdk
2020. 5. 9. 23:06
문제 링크: 백준/BOJ https://www.acmicpc.net/problem/1748
1748번: 수 이어 쓰기 1
첫째 줄에 N(1≤N≤100,000,000)이 주어진다.
www.acmicpc.net
입력받은 N에 대해 자릿수를 계산한 뒤
해당 자릿수를 제외한 자릿수를 가지는 수의 개수를 arr배열에 미리 저장해둔 값을 이용해 계산해주었다.
그리고 해당 자릿수의 값들은 개수를 직접 계산해서 더해주었다.
예시로 N = 12인 경우를 간단히 살펴보자.
12는 두 자릿수이므로 len = 2이다.
한 자릿수의 수들(1~9)는 arr [1] 개이고 각 수는 한 자릿수이므로 총 9자리이다.
두 자릿수는 12 - 10 + 1 = 3개이고, 각 수는 두 자릿수이므로 총 3*2 = 6자리이다.
따라서 총 15자리임을 계산할 수 있다.
/*
20200308
1748번 - 수 이어 쓰기1
*/
#include <iostream>
#include <cmath>
using namespace std;
int arr[10] = { 0,9,90,900,9000,90000,900000,9000000,90000000,1 };
int calLen(int n) {
int cnt = 0;
while (n) {
cnt++;
n /= 10;
}
return cnt;
}
int main() {
cin.tie(NULL); ios_base::sync_with_stdio(false);
int n, len, ans = 0;
cin >> n;
len = calLen(n);
for (int i = 1; i <= len; ++i) {
if (i < len) {
ans += (arr[i] * i);
}
else
ans += ((n - pow(10, i - 1)+1)*i);
}
cout << ans;
}