-
level 2 - N개의 최소공배수자료구조와 알고리즘/프로그래머스 문제풀이 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); } }
'자료구조와 알고리즘 > 프로그래머스 문제풀이' 카테고리의 다른 글
level 1 - 문자열 다루기 기본 (0) 2020.07.20 level1 - 문자열 내 마음대로 정렬하기 (0) 2020.07.16 level 1 - 체육복 (0) 2020.07.15 level 1 - 완주하지 못한 선수 (0) 2020.07.10