백준 단계별 문제풀이 9단계 (약수, 배수와 소수)
https://www.acmicpc.net/problem/2501
# 문제
어떤 자연수 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은 1 이상 10,000 이하이다. K는 1 이상 N 이하
6 3
출력 : 첫째 줄에 N의 약수들 중 K번째로 작은 수를 출력한다. 만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 0을 출력하시오.
3
# 필요개념
해당 문제는 출력조건인 'k번째 약수가 존재하지 않을 경우 0 출력' 만 주의한다면 쉽게 풀 수 있는 문제이다. 이 문제를 기록하는 이유는 BufferedReader와 StringTokenizer에 대한 활용을 정리하기 위함이다.
Scanner를 이용하는 것보다 BufferedReader를 이용하는 편이 속도가 더 빨라 자주 이용하게 되는데, BufferedReader은 한 줄씩 입력을 받는다는 특징이 있다. 그래서 이 문제의 입력처럼 한 줄에 여러개의 입력을 받을 때, StringTokenizer를 사용한다.
StringTokenizer은 우리가 지정한 구분자로 문자열을 나누어주는 클래스이다. StringTokenizer을 생성할 때 인수에 나눌 문자열과 구분자를 넣을 수 있는데, 여기에 readLine() 함수를 넣어 BufferedReader로 받은 문자열을 인수로 넣는다.
파라미터는 다음과 같이 넣어주면 된다.
생성자 | 설명 |
public StringTokenizer(String s) | 기본값인 공백문자로 s를 분리 |
public StringTokenizer(String s, String d) | 지정한 d를 기준으로 s 분리 |
메소드는 다음과 같이 있다.
메소드 | 설명 |
hasMoreTokens() | 반환할 토큰이 있는지 여부를 boolean 형태로 반환 |
nextToken() | 다음 토큰 반환 |
countToken() | 남아있는 토큰 개수 반환 |
# Code
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int cnt = 0;
int i = 1;
while (a >= i) {
if (a % i == 0) cnt++;
if (cnt == b) break;
i++;
}
if (i > a) System.out.println(0);
else System.out.println(i);
}
}
# 결과
'코딩테스트 > 백준 브론즈,실버' 카테고리의 다른 글
[백준] 2908 : 상수 (StringBuffer vs StringBuilder) - JAVA (0) | 2024.01.26 |
---|---|
[백준] 9506 : 약수들의 합 (List 활용) - JAVA (1) | 2024.01.23 |
[백준] 11005 : 진법 변환2 (Stack활용하기, String으로 변환) - JAVA (1) | 2024.01.21 |
[백준] 2563 : 색종이 (Arrays.fill() 주의점) - JAVA (0) | 2024.01.17 |
[백준] 10789 : 세로읽기 (이차원배열) - JAVA (0) | 2024.01.17 |