[문제] 1, 4, 8, 9, 16, 25, 27, 32, 36, 49, 64...와 같은 어떤수의 거듭제곱으로 만들어진 수들이 정렬되어 있을때 n번째 거듭제곱수를 구하시오
답변 예시
n | answer |
1 | 1 |
2 | 4 |
5 | 16 |
6 | 25 |
완전 거듭제곱수는 m^k으로 이루어진 수이다.
1 = 1^k
4 = 2^2
8 = 2^3
9 = 3^2
16= 4^2
25 = 5^2
27 = 3^3
...
이문제는 특별한 규칙이 없으므로 모든수를 구하고 순서를 정하자.
long long nth_perfect_power(int n){
if(n == 1) return 1;
auto limit = 1e10;
set<long long> powers;
for(long long m = 2; m * m < limit; m++){
long long power = m * m;
while(power < limit){
powers.insert(power);
power *= m;
}
}
auto it = powers.begin();
std::advance(it, n-2);
return *it;
}
이 소스는 퍼포먼스에 문제가 있습니다.
set은 고성능으로 sorting된 형태로 저장하지만 위와 같은 소스에서는 set으로 인하여 탐색과 삽입을 수십만번 반복함으로써 성능상의 문제가 발생합니다.하여 저장시에는 저장만하고 마지막에 한번 sorting하는 방식으로 바꿔봅니다.
long long nth_perfect_power2(int n){
if(n == 1) return 1;
auto limit = 1e10;
vector<long long> powers;
for(long long m = 2; m * m < limit; m++){
long long power = m * m;
while(power < limit){
powers.push_back(power);
power *= m;
}
}
std::sort(powers.begin(), powers.end());
return powers[n-2];
}
'programming' 카테고리의 다른 글
[Algorithm] n개의 박스에서 k개를 골라 n명에서 공평하게 나눠주기 (1) | 2024.11.04 |
---|---|
[Algorithm] 연속된 숫자열에서 n번째 문자 알아내기 (0) | 2024.11.04 |
[Algorithm] C++ 뒤집어도 같은 숫자(palindrome) 판별하기 (0) | 2023.06.13 |
[Algorithm] C++ 부분 영역 넓이 구하기(Graph, DFS) (0) | 2023.06.09 |
IntelliJ에서 Rust 시작하기 (0) | 2023.06.08 |