성장일기

내가 보려고 정리하는 공부기록

코딩테스트/백준 브론즈,실버

[백준] 2501 : 약수 구하기 (StringTokenizer 활용하기) - JAVA

와나나나 2024. 1. 23. 00:11
728x90

백준 단계별 문제풀이 9단계 (약수, 배수와 소수)

https://www.acmicpc.net/problem/2501

 

2501번: 약수 구하기

첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다.

www.acmicpc.net

 

 

# 문제

어떤 자연수 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);

    }
}

 

 

# 결과