
난이도: ★★☆☆☆ • solved on: 2025-07-12

자료구조
알고리즘/기법
핵심 키워드
- 문제 분해
- 1부터 n까지 차례로 모든 수 에 대해 이 로 나누어떨어지는지 확인 → 약수 찾기
- 찾을 때마다 카운트 증가, 번째면 바로 출력
- 핵심 로직 흐름
for i = 1 ~ n: if n % i == 0: cnt++ if cnt == k: print i 종료- 예외 처리
- 반복문이 끝난 후에도 cnt < k → 0 출력
import java.util.*;
import java.lang.*;
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] line = br.readLine().split(" ");
int n = Integer.parseInt(line[0]);
int k = Integer.parseInt(line[1]);
int cnt = 0;
for(int i=1;i<=n;i++){
if(k==1){
System.out.print(1);
cnt++;
break;
}
if(n%i==0){
cnt++;
if(cnt==k){
System.out.print(i);
break;
}
}
}
if(cnt<k){
System.out.print(0);
}
}
}
- 문제 분해
- 약수는 항상 와 의 짝으로 등장 (
i* (n/i) = n)- 1~√n까지만 반복, 약수를 리스트에 저장
- 반복 종료 후 리스트를 정렬 → k번째 찾기 (공간, 시간 모두 개선)
- 핵심 로직 흐름
for i = 1 ~ sqrt(n): if n % i == 0: add i if i != n/i: add n/i 정렬 k-1 인덱스 값 출력 (없으면 0)- 예외 처리
- k > 약수 개수면 0
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
ArrayList<Integer> divisors = new ArrayList<>();
for(int i = 1; i * i <= n; i++) {
if(n % i == 0) {
divisors.add(i);
if(i != n / i) divisors.add(n / i);
}
}
Collections.sort(divisors);
if(k > divisors.size()) System.out.println(0);
else System.out.println(divisors.get(k - 1));
}
}
방법 1
- 시간 복잡도: O(N)
- 공간 복잡도: O(1)
방법 2
- 시간 복잡도: O(√N + D log D) (D: 약수 개수, 보통 O(√N))
- 공간 복잡도: O(D) (약수 저장)
비슷한 유형 (GPT 추천):
확장 문제 (GPT 추천):