기타등등/알고리즘 기록

[C++] 숫자의 총 개수(Large)

CodeJB 2021. 6. 18. 18:58

방법

  • 규칙성 : 자릿수에 따라서 갯수가 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