by CodeJin19
1 min read

Categories

Tags

오늘의 문제는 “1748번 수 이어 쓰기 1”.

1부터 n까지의 수를 이어서 써서 하나의 숫자를 만들때, 이 수는 몇 자릿수인지 구하는 문제이다.

예를 들어 n이 13이면

12345678910111213

인 하나의 수가 생기고 이 수는 17자리수이다.

두 자리 수들과 세 자리 수들을 살펴 규칙을 파악해보자.

두 자리 수는 10 ~ 99까지 모두 90개가 있고, 각각 두 자리 숫자이므로

두 자리 수들을 모두 이어쓸 경우

2 * 90 = 180

180자리 수가 생성된다.

세 자리 수는 100 ~ 999까지 모두 900개의 수가 있고, 각각 세 자리 수이므로

세 자리 수들을 모두 이어쓸 경우

3 * 900 = 2700

2700자리 수가 생성된다.

즉 x자리 수들을 이어 쓰면

x * 9 * 10^(x - 1) 자리의 수가 된다.

#include <iostream>

using namespace std;

int main()
{
	int n;
	int sum = 0;
	int limit = 10;
	int x = 1;

	cin >> n;

	if (n < 10) //n이 한 자리 수이면 그 수가 곧 자릿수이다.
	{
		cout << n << endl;
	}
	else // n 10 이상인 경우...
	{
		while (limit < n)
		{
			sum += (9 * x * limit / 10);
			limit *= 10;
			x++;
		}

		limit /= 10;

		sum += ((n - limit + 1) * x);

		cout << sum << endl;
	}
	return 0;
}

이 경우 n이 100이면

1 ~ 9 -> 9자리

10 ~ 99 -> 180자리

100 -> 3자리

이므로 192가 나와야 한다.

하지만 n = 100의 경우, limit가 10인 경우에만 while문을 돌아서 오차가 생긴다.

따라서 while문의 조건문을 limit <= n으로 고쳐주면

#include <iostream>

using namespace std;

int main()
{
	int n;
	int sum = 0;
	int limit = 10;
	int x = 1;

	cin >> n;

	if (n < 10)
	{
		cout << n << endl;
	}
	else
	{
		while (limit <= n)
		{
			limit /= 10;
			sum += (9 * x * limit);
			limit *= 100;
			x++;
		}
        
		limit /= 10;
		sum += ((n - limit + 1) * x);

		cout << sum << endl;
	}

	return 0;
}

while문이 limit = 100인 경우도 돌아서 오차가 생기지 않는다.

이 문제는 간단한 수학만 적용하면 풀 수 있는 문제지만, 역시 while문의 조건문에서 등호 하나를 빼먹는 바람에 틀렸다.