https://www.acmicpc.net/problem/1748
<C++>
#include <bits/stdc++.h>
#define F_I ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;
int main()
{
F_I;
int n, end, start, sum = 0;
bool flag = false;
cin >> n;
for (int mul = 1, len = 1;; mul *= 10, len++)
{
if (flag == true)
break;
start = mul;
end = mul * 10-1;
if (end >= n) //end 보다 n이 작거나 같을 때의 예외처리!
{
end = n;
flag = true;
}
sum += (end - start + 1) * len;
}
cout << sum << endl;
}
> 자연수 1~9의 숫자의 길이는 1이다. 마찬가지로 10~99의 길이는 2이다. 100~999의 길이는 3이다...
이 규칙을 적용하면 된다.
> (end-start+1)은 숫자의 길이가 len인 자연수의 개수이다.
(end-start+1) 에다가 길이(len)을 곱해준 것을 sum에 계속 더해주면 된다.
> 만약 end 보다 n이 작거나 같다면, end를 n으로 바꿔주는 예외처리를 해줘야 한다.
> 예를 들어, n이 120이라면,
1~9 : 자연수의 길이 1
10~99 : 자연수의 길이 2
100~120 : 자연수의 길이 3 이므로
sum = (10-1+1)*1 + (100-10+1)*2 + (120-100+1)*3 이다.
(10-1+1)*1 >> (10-1+1) 은 1부터 9까지의 자연수의 개수이고, 1은 자연수의 길이이다.
(100-10+1)*2 >> (100-10+1)은 10부터 99까지의 자연수의 개수이고, 2는 자연수의 길이이다.
(120-100+1)*3 >> (120-100+1)은 120부터 100까지의 자연수의 개수이고, 3은 자연수의 길이이다.
> flag가 true라면, 다시 말해 end보다 n이 작거나 같다는 조건을 한번이라도 만족했다면 (탈출 조건을 만족했다면)
break를 하여 탈출한 뒤, 이때까지 더했던 sum을 출력하면 된다.
'Problem Solving > 백준' 카테고리의 다른 글
[백준] 10972번 : 다음 순열 (0) | 2020.07.16 |
---|---|
[백준] 15650번 : N과 M (2) (0) | 2020.07.15 |
[백준] 17363번 : 우유가 넘어지면? (0) | 2020.07.13 |
[백준] 4690번 : 완전 세제곱 (0) | 2020.07.12 |
[백준] 2309번 : 일곱 난쟁이 (0) | 2020.07.11 |