문제출처: https://www.acmicpc.net/problem/1748


문제

1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.

1234567891011121314151617181920212223...

이렇게 만들어진 새로운 수는 몇 자리 수일까? 이 수의 자릿수를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 N(1≤N≤100,000,000)이 주어진다.


출력

첫째 줄에 새로운 수의 자릿수를 출력한다.


풀이

노트에 규칙성을 찾기위해 각 자릿수의 수들의합은 몇자리인지 적어봅니다

(1~9는 9, 10~99는 180,100~999는 2700입니다. 보기의 120의 답은 252입니다. 규칙성을 눈치채셨나요?

답은 n-1자리수까지의 숫자들을 나열한 수의 자릿수 + (n(끝값) - n자릿수의 시작 수- +1) * n입니다.

( 120-> 9(1~9) +180(10~99) + 63(100~120)=252 )

좀 복잡해보이지만 코드를 보면 이해가 갈거에요.

결론적으로, 위의 수식에서 색칠된 부분만 변수로 선언하여 답을 유도하면됩니다.


코드

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string n;
	cin >> n;
	//120의 자릿수=3
	int len = n.size();
	//1~9자릿수 합=9
	//10~99자릿수 합180
	//100~120자릿수 합 63
	//답: len-1자릿수까지의합+(n-n자리숫자의시작수+1)*n의 자릿수
	if (len == 1)
	{
		cout << stoi(n);
		return 0;
	}
	//temp1=n자리숫자일때끝값(1자리:9,2자리:99,3자리:999)
	//temp2=n자리숫자일때첫값(1자리:1,2자리:10,3자리:100)
	int ans = 0, temp1 = 9, temp2 = 1;
	for (int i = 1; i < len; i++)
	{
		ans += temp1 * i;
		temp1 *= 10;
		temp2 *= 10;
	}
	cout << ans + (stoi(n) - temp2 + 1) * len << endl;

}


결과



+ Recent posts