11번 문제
내가 풀이한 답
문제를 봤을 때 자릿수를 기준으로 count값을 증가시키면 된다는게 핵심이라고 생각했고 이 자릿수를 어떻게 구별할지에 대해 곰곰히 생각해보았다. 처음 든 생각은 입력된 n까지 순회(for)를 돌면서 그 안에서 또 while문을 돌아 10으로 나누어 count값을 증가시키는 쪽으로 생각을 했다.
그러다 문제를 더 읽다보니 입력 설명에서 조건이 십만 미만이라고 한 점에서 분기문만 이용해서 처리해도 된다고 생각을 했다. 15인 두 자리수를 예로 들면 한 자리수는 1만 증가시켜주면 되므로 총합은 9이다. 따라서 15에서 9를 뺀 나머지 6에 2를 곱해주면 된다고 생각했고 100인 세 자리수를 예로 들면 한 자리수에 해당하는 9와 십의 자리수에 해당하는 10~99까지 총 90개를 곱하기 2해주고 나머지 세 자리수인 100만 3을 더해주면 된다고 생각했다.
#include <stdio.h>
using namespace std;
int main(int argc, char** argv) {
//freopen("input.txt", "rt", stdin);
int n, cnt;
scanf("%d", &n);
if(n<10){
cnt = n;
}
else if(n>=10 && n<100){
cnt = (n-9)*2 + 9;
}
else if(n>=100 && n<1000){
cnt = (n-9-90)*3 + (90*2) + 9;
}
else if(n>=1000 && n<10000){
cnt = (n-9-90-900)*4 + (900*3) + (90*2) + 9;
}
else if(n>=10000 && n<100000){
cnt = (n-9-90-900-9000)*5 + (9000*4) + (900*3) + (90*2) + 9;
}
printf("%d", cnt);
return 0;
}
그 결과 통과를 했다.
그리고 처음에 생각했던 것처럼 입력된 n까지 순회(for)를 돌면서 그 안에서 또 while문을 돌아 10으로 나누어 count값을 증가시키는 쪽의 코드는 다음과 같다.
#include <stdio.h>
using namespace std;
int main(int argc, char** argv) {
//freopen("input.txt", "rt", stdin);
int n, cnt, i, temp;
scanf("%d", &n);
for(i=1; i<=n; i++){
temp = i;
while(temp>0){
temp /= 10;
cnt++;
}
}
printf("%d", cnt);
return 0;
}
역시 통과를 했다.
사이트의 답안
#include<stdio.h>
int main(){
//freopen("input.txt", "rt", stdin);
int n, i, cnt=0, tmp;
scanf("%d", &n);
for(i=1; i<=n; i++){
tmp=i;
while(tmp>0){
tmp=tmp/10;
cnt++;
}
}
printf("%d\n", cnt);
return 0;
}
사이트의 답안은 내가 맨 처음 생각했던 답안과 비슷하다.
'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글
13. 가장 많이 사용된 자릿수 (0) | 2020.09.03 |
---|---|
12. 숫자의 총 개수(large) (0) | 2020.09.03 |
10. 자릿수의 합 (0) | 2020.09.03 |
9. 모두의 약수 (0) | 2020.09.02 |
8. 올바른 괄호 (0) | 2020.09.02 |