27번 문제   

 


 

    내가 풀이한 답   

 문제를 읽고 소인수분해를 이용하여 풀어야겠다는 생각을 했다. 입력값의 범위가 작다보니 순회(for, while)문을 중첩해도 상관없다고 생각하고 코드를 짯다. 

 

 핵심은 소수로 표현할 때 소수의 범위는 n을 넘지 않는 다는 것이다. 따라서, n크기의 배열을 생성하여 각각의 수들을 소인수분해 하고 해당 배열의 인덱스를 증가시켜주는 방법이다. 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);
	int n, i, j, temp;
	scanf("%d", &n);
	
	int *arr = (int *)malloc(sizeof(int) * (n+1));
	memset(arr, 0, sizeof(int)* (n+1));
	
	for(i=2; i<=n; i++){
		temp=i, j=2;
		while(temp>1){
			if(temp%j==0){
				arr[j]++;
				temp /= j;
			}
			else j++;
		}
	}
	
	printf("%d! = ", n);
	for(i=2; i<=n; i++){
		if(arr[i] != 0) printf("%d ", arr[i]);
	}

	return 0;
}

 

 결과는 통과하였다.

 

 



    사이트의 답안   

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;

int main(){
	//freopen("input.txt", "rt", stdin);
	int n, i, j, tmp;
	scanf("%d", &n);
	vector<int> ch(n+1);
    
	for(i=2; i<=n; i++){
		tmp=i;
		j=2;
		while(1){
			if(tmp%j==0){
				ch[j]++;
				tmp=tmp/j;
			}
			else j++;
			if(tmp==1) break;
		}
	}
    
	printf("%d! = ", n);
	for(j=2; j<=n; j++){
		if(ch[j]!=0) printf("%d ", ch[j]);
	}
    
	return 0;
}
				
		

 

  사이트의 답과 똑같은 논리임을 확인하였다.

'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글

29. 3의 개수는?(small)  (0) 2020.09.08
28. N!에서 0의 개수  (0) 2020.09.08
26. 마라톤  (0) 2020.09.08
25. 석차 구하기  (0) 2020.09.08
24. Jolly Jumpers  (0) 2020.09.08