https://programmers.co.kr/learn/courses/30/lessons/12940
[문제]
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
[제한 조건]
두 수는 1이상 1000000이하의 자연수입니다.
[코드]
class Solution {
public int[] solution(int n, int m) {
int[] answer=new int[2];
int a=m;
int b=n;
/*
* 유클리드 호제법을 사용하여 최대공약수 구하기
* GCD(a,b) = GCD(b,r) 이때 r은 a%b를 의미한다.
*/
while(b!=0) {
int r=a%b;
a=b;
b=r;
}
answer[0]=a; // 최대공약수 저장
answer[1]=(n/a)*(m/a)*a; // 최소공배수 구하기
return answer;
}
}
[고찰]
이번 문제는 이전에 백준에서도 풀어보았던 최대공약수, 최소공배수 문제였다. 최대공약수만 구하면 최소공배수는 각각의 값을 최대공약수로 나눈 몫과 최대공약수의 곱으로 구할 수 있기 때문에 최대공약수를 구하는 것이 중점인 문제이다. 최대공약수는 유클리드 호제법이란 알고리즘으로 구할 수 있다.
유클리드 호제법이란 a와 b의 최대공약수를 (a,b)라고 할 때 (a,b)의 최대공약수는 (b,r)의 최대공약수와 같다는 것을 말한다. 여기서 r은 a를 b로 나눈 나머지를 의미한다. 즉, GCD(a,b) = GCD(b,r) 이다.
예를 들어 GCD(581,322)일 때 r(나머지)=259이다. 즉, GCD(581,322)=GCD(322,259)이다. 이를 반복하면 GCD(581,322) = GCD(322,259) = GCD(259 63) = GCD(63,7) = GCD(7,0) = 7 이 된다.
이와 같은 과정을 코드로 구현하면 위와 같고 이렇게 최대공약수를 구했다면 최소공배수 또한 쉽게 구할 수 있다.
'프로그래머스' 카테고리의 다른 글
[프로그래머스_Level1] 제일 작은 수 제거하기 (0) | 2021.07.12 |
---|---|
[프로그래머스_Level1] 짝수와 홀수 (0) | 2021.07.12 |
[프로그래머스_Level1] 콜라츠 추측 (0) | 2021.07.10 |
[프로그래머스_Level1] 평균 구하기 (0) | 2021.07.10 |
[프로그래머스_Level1] 하샤드 수 (0) | 2021.07.10 |