반응형
수학문제였습니다.
풀이방법
1. 단순 반복문으로는 시간초과 또는 메모리 초과를 맛볼 수 있으니 자릿수가 달라지는 구간에 대해 수학적으로 접근해야 합니다.
2. n이 1 ~ 9까지는 자리수가 1개씩 더해집니다. 10 ~ 99까지는 자리수가 2개씩 더해집니다. 100 ~ 999까지는 자리수가 3개씩 더해집니다. 따라서 n의 자리수만큼 loop를 돌며 해당하는 값을 적절히 더해주면 됩니다.
Code
#include<iostream>
#include<string>
using namespace std;
int ans, margin, behind = 9, after = 1;
int main(){
string n;
cin >> n;
for (int i = 1; i < n.size(); i++){
ans += behind * i;
behind *= 10;
after *= 10;
}
margin = (stoi(n) - after + 1) * n.size();
cout << ans + margin << endl;
}
'Algorithm > Math' 카테고리의 다른 글
(C++) - 백준(BOJ) 10972번 : 다음 수열 (0) | 2021.05.02 |
---|---|
(C++) - 백준(BOJ) 16479번 : 컵라면 측정하기 (0) | 2021.05.02 |
(C++) - 프로그래머스(연습문제) : 최솟값 만들기 (0) | 2021.04.04 |
(C++) - 백준(BOJ) 1673번 : 치킨쿠폰 (0) | 2021.03.18 |
(C++) - 백준(BOJ) 1002번 : 터렛 (0) | 2021.03.09 |