
방법
- 규칙성 : 자릿수에 따라서 갯수가 9*(10씩 증가)함을 알 수 있다.
- 계속 반복한다.
- 반복할 때마다 자릿수는 1씩 카운트된다.
- 반복할 때마다 개수는 9를 시작으로 10씩 곱해준다.

- 256이라는 값이 들어왔다고 가정해보겠다.
- 자릿수는 3자릿수까지 계산해야겠지만 개수는 900개이면 안된다.
- 따라서, 256-(두자릿수 개수의 합=99)를 해주면 256이라는 숫자의 세자리 숫자의 개수가 나온다.
- 즉, n-(지난 자릿수 숫자의 합)이 될 것이다.

- 자릿수(cnt) , 개수(d), 총개수(res)로 생각해보면
- 반복할때마다 총개수(res)는 누적값이 계속 활용되고, cnt는 1씩 증가, d는 10씩 증가한다.

- 이렇게 결과값은 res = res + (cnt * (n-sum))을 통해 구할 수 있음을 알았다.
- 그런데, 반복을 어느시점에 멈춰줘야 하는지를 아직 알지 못하였다.
- 반복을 멈춰야 하는 시점은, 256은 3자리 수이기 때문에 3자리 수의 총 개수인 999개를 넘어서면 안된다.
- 따라서 999를 구하는 방법은 (3자리 수의 d(900개)+sum(99개))일 것이다.
- 따라서 while문의 조건은 d+sum < n으로 한다.
//large
int main() {
int n, res = 0, d = 9, cnt = 1, sum = 0;
cin >> n;
while(d+sum < n){
res = res + (cnt * d);
sum = sum + d;
cnt++;
d*=10;
}
res = res + ((n-sum)*cnt);
cout << res;
return 0;
}
성찰
- while문으로 해결해야한다는 생각까지 잘 도달하였다.
- 그리고 공식 추론은 해냈지만 while의 조건문은 추론하지 못하여서 아쉽다..
'기타등등 > 알고리즘 기록' 카테고리의 다른 글
[C++]뒤집은 소수 (0) | 2021.06.18 |
---|---|
[C++]가장 많이 사용된 자릿수 (0) | 2021.06.18 |
[C++] 자릿수의 합 & 숫자의 총 개수 (0) | 2021.06.18 |
[C++]약수의 개수 (0) | 2021.06.18 |
[C++] 올바른 괄호 (0) | 2021.06.16 |