본문 바로가기
Problem Solving/백준

[백준 ] 1748번 : 수 이어 쓰기 1

by shinbian11 2020. 7. 14.

https://www.acmicpc.net/problem/1748

 

1748번: 수 이어 쓰기 1

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

www.acmicpc.net


<C++>

#include <bits/stdc++.h>
#define F_I ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;

int main()
{
	F_I;

	int n, end, start, sum = 0;
	bool flag = false;
	cin >> n;
	for (int mul = 1, len = 1;; mul *= 10, len++)
	{
		if (flag == true)
			break;
		start = mul;
		end = mul * 10-1;
		if (end >= n) //end 보다 n이 작거나 같을 때의 예외처리!
		{
			end = n;
			flag = true;
		}
		sum += (end - start + 1) * len;
	}
	cout << sum << endl;
}

 

> 자연수 1~9의 숫자의 길이는 1이다. 마찬가지로 10~99의 길이는 2이다. 100~999의 길이는 3이다...

이 규칙을 적용하면 된다.

 

> (end-start+1)은 숫자의 길이가 len인 자연수의 개수이다.

(end-start+1) 에다가 길이(len)을 곱해준 것을 sum에 계속 더해주면 된다.

 

> 만약 end 보다 n이 작거나 같다면, end를 n으로 바꿔주는 예외처리를 해줘야 한다.

 

> 예를 들어, n이 120이라면,

1~9 : 자연수의 길이 1

10~99 : 자연수의 길이 2

100~120 : 자연수의 길이 3 이므로

 

sum = (10-1+1)*1 + (100-10+1)*2 + (120-100+1)*3 이다.

 

(10-1+1)*1 >> (10-1+1) 은 1부터 9까지의 자연수의 개수이고, 1은 자연수의 길이이다. 

(100-10+1)*2 >> (100-10+1)은 10부터 99까지의 자연수의 개수이고, 2는 자연수의 길이이다.

(120-100+1)*3 >> (120-100+1)은 120부터 100까지의 자연수의 개수이고, 3은 자연수의 길이이다.

 

> flag가 true라면, 다시 말해 end보다 n이 작거나 같다는 조건을 한번이라도 만족했다면 (탈출 조건을 만족했다면)

break를 하여 탈출한 뒤, 이때까지 더했던 sum을 출력하면 된다.