[기억할 내용들]
- 소인수 분해를 이용해서 풀면 되는 문제이다.
- 만약 7! 이면 7*6*5*4*3*2*1 인데, 여기서 각각의 수를 소인수 분해해서 배열 요소를 ++ 해주는 식으로 풀면 되는 문제였다.
- 7 이면 배열 인덱스 7번의 요소가 ++, 6이면 배열 인덱스 2 & 3번의 요소가 ++ 되는 식으로 구현해주면 되는 문제.
[나의 코드]
#include <iostream>
#include <stdio.h>
#include <string>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
int n;
cin >> n;
// [0]:0, [1]:1, [2]:2, ..., [n]:n
vector<int> table(n+1);
for (int i = 2; i <= n; i++) {
int temp = i;
int start = 2;
while (temp > 1) {
if (temp%start==0) {
table[start]++;
temp /= start;
}
else
start++;
}
}
cout << n << "! = ";
for (int i = 0; i < table.size(); i++) {
if (table[i] != 0)
cout << table[i] << " ";
}
cout << "\n";
return 0;
}
[강의 코드]
#include <iostream>
#include <stdio.h>
#include <string>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int i, j, n, tmp;
scanf_s("%d", &n);
vector<int> ch(n+1);
for (i = 2; i <= n; i++) {
tmp = i;
j = 2;
while (1) {
if (tmp % j == 0) {
tmp /= j;
ch[j]++;
}
else j++;
if (tmp == 1) break;
}
}
printf("%d! = ", n);
for (i = 2; i <= n; i++)
if (ch[i] != 0) printf("%d ", ch[i]);
return 0;
}
[의견]
모르겠어서 강의 초반 내용을 보고 참고해서 코드를 작성했다.. 이런 문제에는 소인수 분해를 이용하면 된다는 것을 떠올리기가 쉽지 않은 것 같다. 문제 유형에 맞게 적절한 풀이 방법을 택하는 것이 가장 어려운 것 같다.. 계속 문제 풀다보면 나아질거라 믿는다.. 파이팅!! 이제 한 문제만 더 풀면 오늘 공부 끝이라고!!!!!!!!!!