포스트

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 라이센스를 따릅니다.