레야몬

[C++] 1019번 책 페이지 - 수학 본문

알고리즘/백준

[C++] 1019번 책 페이지 - 수학

Leyamon 2022. 10. 3. 01:42
#include <stdio.h>
#include <math.h>
#include <string.h>

typedef long long int ll;

char N[15];  //자연수 N
ll num[10];

int main()
{
    int n=-1;
    
    scanf("%s", N);
    
    for(int i=0; N[i]; i++) n++; //자릿수 세기

    
    //앞에 있는 숫자
    num[0]+=(n-1)*(ll)pow(10, n-1) - ((ll)pow(10, n-1)-1)/9 - n*(ll)pow(10, n-1);
    for(int i=0; i<=9; i++) num[i]+=n*(ll)pow(10, n-1)*(N[0]-'0');
    for(int i=1; i<N[0]-'0'; i++) num[i]+=(ll)pow(10, n);
    num[N[0]-'0']+=atoll(N+1)+1;
    n--;
    
    for(int i=1; N[i]; i++) {
        for(int j=0; j<=9; j++) num[j]+=(ll)n*(ll)pow(10, n-1)*(N[i]-'0');
        for(int j=0; j<N[i]-'0'; j++) num[j]+=(ll)pow(10, n);
        num[N[i]-'0']+=atoll(N+i+1)+1;
        n--;
    } 
    
    for(int i=0; i<=9; i++)
        printf("%lld ", num[i]);
    
    return 0;
}

<알고리즘>

  1. 제일 앞에 있는 숫자는 0은 처음에는 (n-1)*10^(n-1)-(10^(n-1)-1)/9에 그 뒤로 0포함 다른 숫자들은 n*10^(n-1)*N[0]에 0은 N[0]-1이다.
  2. 남은 숫자들 만큼 제일 앞 숫자가 계속 나타나므로 atoll(N+1)+1만큼 해준다.
  3. 뒤  숫자들도 비슷한 방법으로 한다.

 

정말 멍멍이 같은 문제였다. 알고리즘을 다 짜고 나니 뭐 없기는 한데 열받는다.

<atoll()>

https://notepad96.tistory.com/67

 

C++ String to int, int to String - 문자열 숫자 형변환

1. 문자열 숫자 간 형변환 문자열(string)을 숫자(int)로 형변환하기 위해서 stoi 함수를 사용할 수 있다. stoi 이는 string to integer이 축약된 단어이며 마찬가지로 double형으로 변환하고 싶다면 stod를, lon

notepad96.tistory.com

 

 

 

 

 

※현재 고등학교 등교중인 학생입니다. 이제 알고리즘을 본격적으로 공부하기 시작해서 아직 초보입니다. 혹시 제가 잘못 알고있는 점이나 더 좋은 풀이 방법이 있어 댓글에 남겨주시면 감사히 하나하나 열심히 읽어보겠습니다. 좋아요, 단순한 댓글 한마디라도 저에겐 큰 힘이 됩니다! 감사합니다.

Comments