문제 설명
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
제한 사항- 두 수는 1이상 1000000이하의 자연수입니다.
3 | 12 | [3, 12] |
2 | 5 | [1, 10] |
입출력 예 #1
위의 설명과 같습니다.
입출력 예 #2
자연수 2와 5의 최대공약수는 1, 최소공배수는 10이므로 [1, 10]을 리턴해야 합니다.
정말 간단한 문제다
수포자 개발자(?)로서 최대공약수와 최소공배수의 기억이 가물가물해서 다시 찾아봤다.
유클리드 호제법이라는 것이 있단다.
유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란 말은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는 알고리즘을 나타낸다. 2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다. 이는 명시적으로 기술된 가장 오래된 알고리즘으로서도 알려져 있으며, 기원전 300년경에 쓰인 《원론》 제7권, 명제 1부터 3까지에 해당한다.
출처 - 위키백과
최소공배수(GCD, Greatest Common Division)a, b 라는 두 수가 주어지면a % b = n (a 를 b로 나눈 나머지는 n이라고 하자)n = 0 인 경우, b 가 최소공배수가 된다.n != 0 인 경우, a에 b를 대입하고, b에 n 을 대입한다(ex, b % n = m)나머지가 0 이 될 때까지 반복한다.
최대공약수(LCM, Least Common Multiple)a * b / 최소공배수
class Solution {
public int[] solution(int n, int m) {
int gcd = getGcd(n, m);
int lcm = (n * m) / gcd;
int[] answer = {gcd, lcm};
return answer;
}
private int getGcd(int a, int b){
int n = a % b;
if(n == 0) return b;
return getGcd(b, n);
}
}
유클리드 호제법을 알고나니 너무나도 쉽게 풀렸다.
반복문을 이용하는 방법과 재귀를 이용하는 방법이 있는데
필자는 재귀를 이용해서 풀어보았다.
수포자는 웁니다.
'개발자의 삶 > Algorithm' 카테고리의 다른 글
[LeetCode] Palindrome Number (with Go) (0) | 2022.02.07 |
---|---|
[LeetCode] Two Sum (with Go) (0) | 2022.02.03 |
[Codility] 4. FrogJmp (0) | 2021.07.28 |
[Codility] 3. OddOccurrencesInArray (0) | 2021.07.19 |
[Codility] 2. CyclicRotation (0) | 2021.07.16 |