11653번: 소인수분해
첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.
www.acmicpc.net
- 2가지 방법으로 풀 수 있고 각 방법 마다 실행 속도가 차이난다.
- 처음에 보자말자 가장 간단하게 for() 를 사용한 코드를 구현했고 32ms가 나왔다.
- 채점 결과에 확인해보니 더 빠른 결과들이 있어 다시 고민하였다.
- sqrt()를 활용하면 더 빠른 수행속도를 기대할 수 있었다.
- for() 사용
더보기
#include <iostream>
#include <vector>
#define MAX_NUM 10000001
int main()
{
// init
std::ios::sync_with_stdio(false);
// input
int N = 0;
(void)scanf("%d", &N);
// calc
if (1 == N)
return 0;
std::vector<int> resultList;
int diviedNum = 2;
while (true)
{
if (1 == N)
{
break;
}
else if (0 == N % diviedNum)
{
N /= diviedNum;
resultList.push_back(diviedNum);
diviedNum = 2;
}
else
{
diviedNum++;
}
}
for(int item : resultList)
{
printf("%d\n", item);
}
return 0;
}
- sqrt() 사용
더보기
#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>
#define MAX_NUM 10000001
void calcSqrtN(const int N, std::vector<int>& dest)
{
int sqrtN = sqrt(N);
if (1 == sqrtN)
{
if(1 != N)
dest.push_back(N);
return;
}
else
{
int diviedN = N / (int)sqrtN;
while (true)
{
if (N == sqrtN * diviedN)
{
if (1 == sqrtN)
{
dest.push_back(N);
}
break;
}
else
{
sqrtN--;
diviedN = N / (int)sqrtN;
}
}
calcSqrtN(sqrtN, dest);
if(N != diviedN)
calcSqrtN(diviedN, dest);
}
}
int main()
{
// init
std::ios::sync_with_stdio(false);
// input
int N = 0;
(void)scanf("%d", &N);
// calc
if (1 == N)
return 0;
std::vector<int> resultList;
calcSqrtN(N, resultList);
// print
std::sort(resultList.begin(), resultList.end());
for(int item : resultList)
{
printf("%d\n", item);
}
return 0;
}
'Coding Problem > 백준' 카테고리의 다른 글
[백준] 18870 - 좌표 압축 (0) | 2021.05.03 |
---|---|
[백준] 2447 - 별 찍기 - 10 (0) | 2021.04.29 |
[백준] 10757 - 큰수 A+B (0) | 2021.04.17 |
[백준] 11004번 - K번째 수 (0) | 2021.01.26 |
[백준] 1977 - 완전제곱수 (0) | 2021.01.22 |