[Java] 약수 구하기 (백준 2501번)

minjung·2022년 11월 26일
0
post-thumbnail

📖문제

어떤 자연수 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번째로 작은 수를 출력하는 프로그램을 작성하시오.

  • 첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다.
  • 첫째 줄에 N의 약수들 중 K번째로 작은 수를 출력한다. 만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 0을 출력하시오.

✏️내 풀이

  1. N의 약수를 구한다.
    1-1. 배열을 만든다.
    1-2. 배열을 List로 바꾼다.
    1-3. 반복문을 통해 구한 약수를 순서대로 List에 넣는다. (add 사용)
    1-4. List를 배열로 바꾼다.
  2. 배열에서 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를 사용해서 값을 추가할 수 있다.

  • 반복문
  1. 반복문을 사용해 값을 추가할 때마다 새로운 배열을 만들고,
  2. 기존 배열의 값을 새로운 배열에 넣은 후,
  3. 추가할 값을 넣는 식으로 배열에 값을 추가할 수 있다.

하지만 이 문제를 풀기에 반복문을 사용하는 방법은 뭔가 좀 비효율적이라는 생각이 들어서 ArrayList를 사용했다.

  • ArrayList
  1. 배열을 List로 변환한다.
  2. add를 사용해서 값을 추가한다.
  3. asList를 사용해서 List를 배열로 바꾼다.

  • 이 외에도 더 많은 방법이 있는 것 같다. 링크 참고

[Java]배열에 값 추가하는 방법

0개의 댓글