[프로그래머스/java]최대공약수와 최소공배수 ※유클리드 호제법
리트리버J
·2020. 12. 20. 23:15
728x90
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
1. 최대공약수 구하기
※ 유클리드 호제법이란?
(A > B 일 때)
A, B의 최대공약수(GCD : greatest common divisor)는 A를 B로 나눈 나머지 r이 있을 때,
B와 r의 최대공약수와 같다.
※ 증명
A = aG, B = bG (G는 최대공약수, a와 b는 서로소)
A = q · B + r (q : 몫, r : 나머지)
aG = q · bG + r
∴ r = (a - qb)G
B = bG
즉, r과 B는 같은 최대공약수 G를 갖는다.
2. 최소공배수 구하기
A * B / 최대공약수
3. while문 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class Solution {
public int[] solution(int n, int m) {
int[] answer = new int[2];
// 큰 수
int a = Math.max(n,m);
// 작은 수
int b = Math.min(n,m);
// 작은수(나누는 수)가 0이 될 때까지 반복
while(b > 0){
// 작은 수(나누는 수)의 임시 변수
int temp = b;
// 나머지가 나누는 수가 된다.
b = a % b;
// 작은수가 큰 수가 된다.
a = temp;
}
// 최대 공약수
answer[0] = a;
// 최소 공배수
answer[1] = n*m/a;
return answer;
}
}
|
cs |
3-1. 재귀함수 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class Solution {
public int[] solution(int n, int m) {
int[] answer = new int[2];
// 큰 수
int a = Math.max(n,m);
// 작은 수
int b = Math.min(n,m);
answer[0] = gcd(a, b);
answer[1] = n*m/answer[0];
return answer;
}
public int gcd(int p, int q){
// 1이상이므로 q==0은 재귀함수의 호출로 올 수 있다.
if(q == 0) return p;
// 좌항에 나누는 수를 넣어 p = q를 만든다.
// 우항에 나머지 값을 넣어 q = p%q를 만든다.
return gcd(q, p%q);
}
}
|
cs |
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
728x90
'알고리즘 > 코딩테스트' 카테고리의 다른 글
[프로그래머스/java]정수 제곱근 판별 (0) | 2020.12.23 |
---|---|
[프로그래머스/java]짝수와 홀수 (0) | 2020.12.21 |
[프로그래머스/java]콜라츠 추측 (0) | 2020.12.20 |
[프로그래머스/java]평균 구하기 (0) | 2020.12.20 |
[프로그래머스/java]하샤드 수 (0) | 2020.12.20 |