본문 바로가기
Programming Language/C C++

[알고리즘 문제풀이] 6. 숫자만 추출★

by 9루트 2022. 1. 4.

 

 

 

내가 푼 코드: 3. 0280000... -> 28로 자릿수를 구해 숫자로 만드는 것만 구현하지 못하였다.

#include <stdio.h>
using namespace std;

int main(){
	freopen("input.txt","rt",stdin);
	
	char array[50];
	int numberArray[50] = {0, }; // 배열의 요소를 모두 0으로 초기 
	int digit, digitNumber, number = 0; // 수릿수, 각 자리수, 구하려는 수 
	int divisorNumber = 0;
	
	// 1. 문자열을 입력한다. 
	scanf("%s", &array);
	printf("%s\n", &array);

	for(int i = 0; i < 50; i++){
		printf("%d", numberArray[i]);
	}

	
	int k = 0;
	// 2. 숫자만 추출하여 자연수로 수를 저장한다. 
	for(int i = 0; i < 50; i++){
		
		
		if( array[i] >= 48 && array[i] <= 57){
			numberArray[k] = array[i] - 48;
			k++;
		}
	} 
	
	printf("\n");
	for(int i = 0; i < 50; i++){
		printf("%d", numberArray[i]);
	}
	printf("\n");
	
	//
	// 3. 배열을 자연수화한다. 
	// 몇 자리 수인지 알아야 한다. 
	for(int j = 0; j < 50; j++){
		
		if( numberArray[j] > 0){
			digit = j + 1; // digit 자릿수 
		} 
	}
	
	printf("자릿수 : %d\n", digit);

	
	// 자릿수를 10의 거듭제근으로 곱하여 수를 구하고 출력한다. 
	for(int j = 0; j < 50; j++){
		digitNumber =  numberArray[j] * (10^(digit-j-1));
		number = number + digitNumber;
	}
	printf("자연수: %d\n", number); 

	
	
	// 4. 자연수의 약수의 개수를 출력한다. 
	for(int i = 1; i <= number; i++){
		if( number % i == 0){
			divisorNumber++;
		}
	}
	printf("약수개수: %d\n", divisorNumber);
	
	return 0;
}

나는 뻘짓을 한건가...

숫자만 추출하여 numberArray 배열에 넣었다.

0280000000.. 이 나오긴 하는데 

자릿수를 어떻게 구해야할 지 모르겠다.

앞에 0이 아닌 수가 나온 지점부터 마지막 0이 아닌 수가 나오는 지점까지 자릿수를 구해야하는 데

35694000334 이런 수 처럼 중간에 0이 나오면 또 복잡해진다.

 

아래 결과출력을 보면 자릿수: 3 부터 잘못되었다. 이걸 해결하지 못했다..

 

아, 그리고

%s, %d 구분잘해서 쓰고

'48' 과 48 처럼 작은 따옴표 잘 구분해서 쓰자.

이런 기본적인 것들을 틀려서 계속 해맸다;;


 

해답

#include <stdio.h>
using namespace std;

int main(){
	//freopen("input.txt","rt",stdin);
	
	char array[50]; // 입력 받을 배열 
	int number = 0; // 구하려는 수 
	int divisorNumber = 0; // 약수의 개수 
	
	// 1. 문자열을 입력한다. 
	scanf("%s", &array);
	

	// 2. 숫자만 추출하여 바로 자연화한다. 
	for(int i = 0; array[i] != '\0'; i++){
		if( array[i] >= 48 && array[i] <= 57){
			number = number*10 + (array[i]-48);
		}
	} 
	printf("%d\n", number); 

	
	// 4. 자연수의 약수의 개수를 출력한다. 
	for(int i = 1; i <= number; i++){
		if( number % i == 0){
			divisorNumber++;
		}
	}
	printf("%d\n", divisorNumber);
	
	
	return 0;
}

 

 

// 2. 숫자만 추출하여 바로 자연화한다. 
	for(int i = 0; array[i] != '\0'; i++){
		if( array[i] >= 48 && array[i] <= 57){
			number = number*10 + (array[i]-48);
		}
	}

 

새로 알게된 점 1

배열의 끝나는 지점에서 for문이 끝나도록

array[i] != '\0'

'\0'이 아닐 때 까지 실행하는 이 코드를 조건문에 넣자

 

 

새로 알게된 점 2

자릿수 찾고 1시간 남짓 삽질을 했는데 이렇게 바로 자연화 할 수 있다니..!!

number = number*10 + (array[i]-48);

0280000.. 을 자연수화 한다고 보면

number = 0

0 = 0 * 10 + (0)

2 = 0 * 10 + (2)

28 = 2 * 10 + (8)

...

이렇게 number = 28 이 된다.

 

 

 

인풋 설정

 

[개념정리] C++ 여러 input방법에 대해

1. 길이를 알고있는 숫자를 입력하고 이를 한글자씩 잘라서 input을 받아야 하는 상황 ex) 입력 : 길이 7의 숫자 1234567를 한번에 입력해야되고 이를 1 / 2 / 3 / 4 / 5 / 6 / 7 이렇게 따로 받아야 되는상황

dbstndi6316.tistory.com