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