알못에서잘알까지 2020. 9. 1. 17:49

    6번 문제   

 

 

 

    내가 풀이한 답   

 

 문자가 50을 넘지 않으므로 51까지 배열을 선언하였다. 그리고C/C++ 에서는 Char형 데이터와 Int형 데이터를 제대로 구분해 본 적이 없었다. 그러던 중 아스키 코드를 알게 되었고 공부를 하게 되었다. (https://almotjalal.tistory.com/22) 공부를 한 뒤 코드를 짜 보니 char형과 int형이 구분되었고 char형 데이터를 int형 데이터로 바꾸는 작업도 성공했다. 그리고 순회(for)를 돌면서 숫자들이 쌓이면 자릿수가 변하므로 *10씩 곱해주었다. 약수 구하는 것은 5번 문제(진약수)와 비슷했다.  

 

#include <stdio.h>
#include <cstring> 
using namespace std;

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);
	char a[51];
	int	num = 0, cnt = 0, i;
	scanf("%s", &a);
	
	for(i=0; i<strlen(a); i++){
		if((a[i]>=48) && (a[i]<=57)){
			num = num * 10 + (a[i]-'0');
		}
	}
	
	for(i=1; i<=num; i++) {
		if(num%i==0) cnt++;
	}
	
	printf("%d\n%d\n", num, cnt);
	return 0;
}

 

 그 결과 통과를 했다.

 


    사이트의 답안   

#include<stdio.h>
using namespace std;
int main(){
	//freopen("input.txt", "rt", stdin);
	char a[100];
	int res=0, cnt=0, i;
	scanf("%s", &a);
    
	for(i=0; a[i]!='\0'; i++){
		if(a[i]>=48 && a[i]<=57){
			res=res*10+(a[i]-48);
		}
	}
    
	printf("%d\n", res);
	for(i=1; i<=res; i++){
		if(res%i==0) cnt++;
	}
    
	printf("%d\n", cnt);
	return 0;
}
	

 

 사이트의 답안과 비슷한데 순회(for)문을 도는 과정에서 차이가 있었다. 배열에서 빈 인덱스는 '\0'으로 채워지는데 그것을 이용한 것이다. 나머지는 다 똑같은 논리였다.