문제 풀이
- 거듭제곱 수열을 만들어 n번째 숫자를 구하는 문제
Code Snippets
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.TreeSet;
public class test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
long start = System.currentTimeMillis();
long n=2;
System.out.println("결과: " + solution(n));
long end = System.currentTimeMillis();
System.out.println("실행시간 :"+(end-start/1000.0));
}
public static long solution(long l) {
//정렬을 위한 리스트
ArrayList<Long> list = new ArrayList<>();
//중복제거를 위한 셋
HashSet<Long> set = new HashSet<>();
//임의의 최대값
long n2 = l*l;
// 1은 거듭제곱해도 증가하지 않으므로 임의로 삽입
set.add((long) 1);
// 주어진 숫자까지의 제곱을 확인
for (int i = 2; i <= l; i++) {
// 이미 다른 수의 거듭제곱에 포함 될 경우 다음 진행
if(set.contains(i))
continue;
long j = (long)i*(long)i;
while(j <= n2) {
set.add(j);
j *= (long)i;
}
}
list.addAll(set);
Collections.sort(list);
long answer = list.get((int) (l-1));
return answer;
}
}
Result
n=1000000일경우
결과: 979846576384
실행시간 :1.591736648948611E12
제곱수열의 값이 해당 인덱스의 제곱보다 작다고 가정 주의 : Integer는 최대 범위가 (2^31)-1 이므로 대략 20억을 고려하여 Long자료형을 사용(필수!!!)