백준 algorithm
백준 1748 - 수 이어 쓰기 1
cosmohoo
2020. 6. 2. 23:15
반응형

=> 브루트 포스 문제입니다.
=> 모든 숫자를 탐색하며 길이를 재 더할 경우, 시간초과의 늪에 빠지게 됩니다.
<시간초과 code>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int N;
cin >> N;
int ans=0;
for(int i=1; i<=N; i++)
{
string str = to_string(i);
int len = str.length();
ans += len;
}
cout << ans<<'\n';
}
=>위와 같은 방법이 아닌 계산으로 더하는 방법을 고안해내야합니다.
-
1~9 : 1(숫자의 길이) * 9(해당하는 숫자의 갯수)
-
해당하는 숫자의 갯수 = 끝숫자 - 첫숫자 +1
-
10~99 : 2 * (99-10 +1)
-
100 ~ 999 : 3 * (999-100+1)
-
...
-
...
-
...
=> 위와 같은 방법을 활용하여 for문을 통해 계산을 해야합니다.
<code>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int N;
cin >> N;
long long ans =0;
for( int start=1, len=1; start <= N; start*=10, len++)
{
int end =start*10-1;
if(end >N)
{
end = N;
}
ans += (long long)(end - start +1)*len;
}
cout <<ans <<'\n';
return 0;
}


***잘 안될때는 남의 code를 써보고 디버깅을 하며 이해하는 방법도 나쁘지 않습니다.
***저는 처음에 이해가 안되어 코드를 쓰고 디버깅을 하며 해당 문제를 이해했습니다.
반응형