본문 바로가기

백준

[JAVA] 백준_2501

2501번: 약수 구하기 (acmicpc.net)

 

2501번: 약수 구하기

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

www.acmicpc.net

[문제]

[문제 분석]

배열로 풀든, StringTokenizer로 풀든 일단 약수들을 모아놔야 하기 때문에 반복문을 작성한다.

두 번째로 입력받은 숫자를 n이라고 하면 약수의 n번째 숫자를 출력해야 하니까 배열의 n번째 숫자를 바로 출력한다.

 

*Scanner가 더 BufferedReader보다 더 편리하지만 속도 측면에서 더 유리하기 때문에 BufferedReader 쓰는 연습을 하는 중이다. 하지만 BufferedReader는 입력값이 무엇이든 문자열로 받아오기 때문에 타입을 바꾸기 위해서는 Integer.parseInt처럼 형변환을 해주어야 한다.

 

* StringTokenizer로 처음에 시도했다가 공백을 기준으로 토큰을 나눈 다음이 문제가 되어 배열로 바꿔 풀었다.

nextToken() 말고 n번째 토큰만을 가져오는 함수는 없을까?

 

1.

[설명]

반복문과 append를 이용해 StringBuilder 클래스인 sb에 a의 약수들을 다 모아놓는다. 

String 배열 ar을 생성하여 sb를 공백 기준으로 나누어 ar에 집어넣는다. (StringBuilder 클래스이므로 toString을 사용해 타입을 변경해주어야 한다.)

만약 입력받은 b가 약수의 개수보다 크다면 0을 출력하고, 그게 아니라면 배열의 원소 값을 출력한다. 

 

구글링을 하다보니 더 간결한 풀이가 있어 시도해보았다.

2.

[설명]

내 풀이는 약수를 한 번에 다 세고 b번째에 맞는 약수를 골라냈다면, 이 풀이는 약수를 세면서 b번째일 때 멈추고 바로 출력하였다.

따라서 시간이 덜 걸린다.

더 좋은 풀이가 있다면 알려주세요!