어떤 자연수 p와 q가 있을 때, 만일 p를 q로 나누었을 때 나머지가 0이면 q는 p의 약수이다.
6을 예로 들면
6 ÷ 1 = 6 … 0
6 ÷ 2 = 3 … 0
6 ÷ 3 = 2 … 0
6 ÷ 4 = 1 … 2
6 ÷ 5 = 1 … 1
6 ÷ 6 = 1 … 0
그래서 6의 약수는 1, 2, 3, 6, 총 네 개이다.
두 개의 자연수 N과 K가 주어졌을 때, N의 약수들 중 K번째로 작은 수를 출력하는 프로그램을 작성하시오.
package lv_1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class B2501 {
public static void main(String[] args) {
//입력값을 받는다.
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
String arr[] = {}; //배열 선언
List<String> list = new ArrayList<>(Arrays.asList(arr)); //배열을 List로
//약수를 구하기 위한 반복문
for(int i=1;i<=n;i++) {
if(n%i==0) { //나머지가 0이면 : 약수이면
list.add(Integer.toString(i)); //약수를 list에 추가
}
}
arr = list.toArray(arr); //list를 arr로
if(arr.length<k) { //약수의 개수가 k보다 적으면
System.out.println(0); //0 출력
}else {
System.out.println(arr[k-1]); //배열에서 k번째로 작은 수 출력
}
}
}
클래스는 무조건 Main
이어야 한다. 그리고 public static void main(String[] args) {}
도 필수이다. import
문장이 빠지지 않도록 주의하자.
입력값을 받기 위해 Scanner
, BufferedReader
를 사용하자. 그래야 채점할 때 필요한 변수값을 받을 수 있다.
찾아보니 Scanner
보다는 BufferedReader
를 쓰는게 좋다고 한다.
배열은 고정크기이다. 그래서 길이를 변경할 수 없지만, 반복문
이나 ArrayList
를 사용해서 값을 추가할 수 있다.
하지만 이 문제를 풀기에 반복문을 사용하는 방법은 뭔가 좀 비효율적이라는 생각이 들어서 ArrayList
를 사용했다.
add
를 사용해서 값을 추가한다.asList
를 사용해서 List를 배열로 바꾼다.