1019 책 페이지
1019 책 페이지 해법
백준 온라인 저지 사이트에 올라와있는 문제이다.
특수한 알고리즘이 필요한 문제는 아니고 수학적인 통찰력으로 해결할 수 있는 문제이다. 입력받은 수의 각 자릿수들을 a1a2…ai…an-1an라고 할때 i번째 자리에 특정 숫자가 몇번씩 등장하는지 고민해보면 문제를 해결할 수 있다.
숫자 target이 i번째 자리에 몇번 등장하는지 구하는 방법은 아래와 같다.
1) ai == target 인 경우
- a1a2…ai-1 * 10n-i + ai+1ai+2…an + 1
2) ai > target 인 경우
- a1a2…ai-1 * 10n-i
3) ai < target 인 경우
- (a1a2…ai-1 + 1) * 10n-i
이때 target == 0 인 경우에는 위와는 조금 다르게 구해야 한다. 자세한 내용은 코드 참고.
#include<cstdio>
using namespace std;
int main()
{
long long n,arr[10]={0,};
scanf("%lld",&n);
for(int i=0;i<10;i++)
{
long long bias = 1;
while(bias<=n)
{
long long l = n/bias/10;
long long target = (n/bias)%10;
long long r = n%bias;
if(i==0)
{
if(target == i && bias != 1)
{
arr[i] += (l-1) * bias + r + 1;
}
else{
arr[i] += l*bias;
}
}
else{
if(target == i)
{
arr[i] += l * bias + r + 1;
}
else if(target < i)
{
arr[i] += l * bias;
}
else{
arr[i] += (l+1) * bias;
}
}
bias *= 10;
//printf("%d\n",arr[i]);
}
printf("%lld ",arr[i]);
}
} 이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.