https://programmers.co.kr/learn/courses/30/lessons/12953
[ 문제 설명 ]
두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다.
예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다.
n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.
[ 제한 사항 ]
[ 입출력 예시 ]
arr | result |
---|---|
[2, 6, 8, 4] | 168 |
[1, 2, 3] | 6 |
최소 공배수는 0이 아닌 두 수를 곱하여 나온 값을 두 수의 최대 공약수로 나누어주면 구할 수 있다.
- (문제 자체에서 테스트 케이스를 정렬 되 상태로 주어주어 생략해도 풀리긴 함)
최소 공배수들을 구하기 위한 값들이 담긴 배열(arr)를 Arrays.sort(); 시켜 정렬한다.
(시간이 더 늘어남)
- 최대 공약수를 구해 줄 메서드(gcd)를 만들어주었다.
메서드(gcd)는 두 수를 매개 변수(매개 변수를 작은 수와 큰 수를 구분해준다.)로 입력 받았을 때, 들어온 작은 수를 큰 수로 나눈 나머지가 0이 될 때 까지 재귀함수로 호출하여 메서드(gcd)를 호출해주고 나눈 나머지가 0이 되었을 때 두 수의 최대 공약수를 반환한다.
- 반환되는 최대 공약수 값을 이용하여 최소 공배수를 구하는 식을 풀어준다.
( answer(최소 공배수) * 다음 배열 값 / gcd(answer, arr[i] )를 하여 최소 공배수를 담아간다.
- answer에 담겨진 최소 공배수를 입력 받은 다음 배열(arr) 값과 다시 메서드를 호출을 반복하여 배열(arr) 끝 값 까지 비교한다.
(배열이 정렬 되어 있으므로, 메서드로 나온 최대 공약수 값은 배열의 다음 값보다 무조건 작은 값이 나올 것이므로 크기에 신경쓰지 말고 메서드(gcd(최대 공약수 값, 배열 값))에 넣어주면 된다.)
앞 선 두 값의 최소 공배수와 다음 값과의 최소 공약수를 구하고 두 값을 곱한 값에 두 값의 최소 공약수를 나누어 최종 최소 공배수를 구하여 반환한다.
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
public int gcd(int n, int m) {
if (m == 0) {
return n;
} else {
return gcd(m, n % m);
}
}
public int solution(int[] arr) {
//Arrays.sort(arr);
int answer = arr[0];
for(int i=1; i<arr.length; i++) {
answer = answer * arr[i] / gcd(answer, arr[i]);
}
return answer;
}
}