728x170
해당 글에서는 Java에서 약수를 구하는 다양한 방법에 대해서 확인해 봅니다.
1) 약수
💡 약수(Divisor)란?
- 어떤 수를 나누어 떨어지게 하는 수를 그 수의 약수라고 합니다.
- 예를 들어 10의 약수는 1, 2, 5, 10입니다.
2) 약수 구현 방법
1. 반복문을 이용하여 약수 찾기
💡 해당 방법은 ‘반복문을 순회’하면서 조건에 맞는 값의 약수를 찾는 방법입니다.
1. 파라미터로 전달받은 숫자(num)를 기반으로 1부터 해당 숫자를 반복문으로 순회합니다.
2. 순회하면서 전달받은 숫자(num)를 순차적인 값으로 나누었을 때 0인 경우 약수를 찾아서 리스트로 반환합니다.
/**
* 반복문(for)를 이용한 약수 리스트 반환 방법
*
* @param {int} num
* @return {List<Integer>} divisorList
*/
public List<Integer> divisor(int num) {
// 약수 리스트를 반환합니다.
List<Integer> divisorList = new ArrayList<>();
for (int i = 1; i <= num; i++) {
if (num % i == 0) {
divisorList.add(i);
}
}
return divisorList;
}
2. 제곱근을 기반으로 줄이는 형태로 약수 찾기
💡 해당 방법은 ‘제곱근을 n으로 줄이면서’ 약수를 찾는 방법입니다.
1. 파라미터로 전달받은 숫자(num)를 기반으로 1부터 순차적인 숫자를 제곱하여 num까지 반복문을 순회합니다.
2. 제곱근을 넘어가면 중복되는 약수가 나오기 때문에 리스트에 값을 넣습니다.
3. i와 num / i가 같지 않은 경우에는 중복되는 약수인 경우 리스트에 값을 넣습니다.
/**
* 제곱근을 n으로 줄여가는 약수 리스트 반환 방법
*
* @param {int} num
* @return {List<Integer>} divisorList
*/
public List<Integer> divisor(int num) {
// 약수 리스트를 반환합니다.
List<Integer> divisorList = new ArrayList<>();
for (int i = 1; i * i <= num; i++) {
if (num % i == 0) {
divisorList.add(i);
if (i != num / i) {
divisorList.add(num / i);
}
}
}
return divisorList;
}
💡 [참고] 상대적으로 '반복문을 이용하는 방법'보다 '제곱근 기반으로 줄여가는 형태의 약수'를 구현하는 방법이 제곱근을 순회하기에 속도가 빠릅니다.
3. 재귀 함수를 이용하여 약수 찾기
💡 해당 방법은 ‘재귀함수’를 이용하여 약수를 찾는 방법입니다.
1. main 함수에서 findDivisor() 변환하려는 숫자(num)와 시작 숫자(i)를 파라미터로 보내면서 호출합니다.
2. 전달받은 findDivisor() 함수에서는 조건에 만족할 때까지 재귀적으로 자기 자신을 반복 수행합니다.
3. 최종 i 값이 num보다 커질 때까지 수행하면서 약수를 구합니다.
public class Main {
public static void main(String[] args) {
int num = 12;
findDivisor(num, 1);
}
private static void findDivisor(int num, int i) {
if(i > num) {
return;
}
if(num % i == 0) {
System.out.print("약수" + i);
}
findDivisor(num, i+1);
}
}
4. Stream을 이용하여서 약수 찾기
💡 해당 방법은 ‘Stream’을 이용하여 약수를 찾는 방법입니다.
1. rangeClosed() 함수를 이용하여서 1 ~ 12까지 순회합니다.
2. 순회하면서 num % i 값이 0과 같을 경우 리스트에 추가합니다.
/**
* Stream 함수를 이용하여서 약수 리스트 반환 방법
*
* @param {int} num
* @return {List<Integer>} divisorList
*/
public List<Integer> divisor(int num) {
List<Integer> resultList = new ArrayList<>();
IntStream.rangeClosed(1, num)
.filter(i -> num % i == 0)
.forEach(i -> resultList.add(i));
System.out.println("resultList :: " + resultList);
return resultList;
}
오늘도 감사합니다. 😀
그리드형
'Java > Short 개발' 카테고리의 다른 글
[Java/Short] 배열을 반으로 나누어 재구성 방법 : for, Arrays.copyOfRange (0) | 2023.11.03 |
---|---|
[Java/Short] 문자열의 접두사(prefix) / 접미사(suffix) 찾는 방법 : startsWith, endsWith (0) | 2023.09.29 |
[Java/Short] 두 개의 배열을 하나의 배열로 합치는 다양한 방법 (0) | 2023.06.05 |
[Java/Short] 배열/리스트의 요소를 역순으로 재구성 방법 : forward to reverse (0) | 2023.06.05 |
[Java/Short] 배열/리스트의 요소를 원하는 개수만큼 재 구성 방법 (0) | 2023.05.29 |