자료구조와 알고리즘/프로그래머스 문제풀이
level 2 - N개의 최소공배수
binaryyoung
2023. 2. 22. 12:48
최소 공배수와 최대 공약수를 구할 수 있다면 쉽게 풀 수 있다.
최소공배수(LCM, Least Common Multiple)는 최대공약수(GCD, Greatest Common Divisor)를 이용해서 구할 수 있다.
public int LCM(int x, int y) {
return x * y / GCD(x, y);
}
최대공약수는 유클리드 호제법을 통한 재귀용법으로 구현할 수 있다.
public int GCD(int x, int y) {
if (y == 0) {
return x;
}
return GCD(y, x % y);
}
배열에 주어진 수들의 최소 공배수는 배열에 있는 모든 수를 곱하고 공통의 최대공약수를 나누면 된다.
예를 들어 {2, 4, 6, 8}의 공통 최대공약수는 직관적으로 2라는 것을 알 수 있고 식으로 표현하면 2 * 4 * 6 * 8 / (2^3) 이 된다.
이를 식으로 표현하면 아래와 같다.
LCM = (arr[0] * arr[1] * … * arr[n-1]) / GCD^(n-1)
하지만 컴퓨터는 한 번에 하나의 연산만 가능하므로, 두 수의 최소공배수를 구하고 그 결과와 다음 숫자의 최소공배수를 구하는 과정을 반복해야 한다.
answer = arr[0];
answer = answer * arr[1] / GCD (answer, arr[1]);
answer = answer * arr[2] / GCD (answer, arr[2]);
…
answer = answer * arr[n-2] / GCD(answer, arr[n -2]);
answer = answer * arr[n-1] / GCD(answer, arr[n -1]);
이를 반복문으로 구현한 최종 코드는 다음과 같다.
class Solution {
public int solution (int[] arr) {
int answer = arr[0];
for (int i = 1; i < arr.length; i++) {
answer = LCM(answer, arr[i]);
}
return answer;
}
public int LCM(int x, int y) {
return x * y / GCD(x, y);
}
public int GCD(int x, int y) {
if (y == 0) {
return x;
}
return GCD(y, x % y);
}
}