Algorithm
[프로그래머스/Level2] N개의 최소공배수 (Java)
haehyun
2022. 1. 10. 19:10
728x90
문제
https://programmers.co.kr/learn/courses/30/lessons/12953?language=java
코딩테스트 연습 - N개의 최소공배수
두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배
programmers.co.kr
풀이
약수, 배수, 공배수, 최소공배수, 최대공약수
- 약수(divisor) : 어떤 정수를 나누어 떨어지게 하는 0이 아닌 정수
- 배수(multiple) : 어떤 정수의 몇 배가 되는 수. (정수a가 정수b로 나뉘어질 때, a는 b의 배수이다)
- 공약수(common divisor) : 2개 이상의 수의 공통인 약수
- 공배수(common multiple) : 2개 이상의 수의 공통인 배수
- 최대공약수(greatest common divisor) : 2개 이상의 수의 공약수 중에서 최대인 수
- 최소공배수(leastest common multiple) : 2개 이상의 수의 공배수 중에서 최소인 수.
최대공약수 문제 팁
- 두 수 a, b의 최대공약수는 b와 (a를 b로 나눈 나머지 값)의 최대공약수와 같다.
- 최대공약수(a, b) == 최대공약수(b, a%b)
- 두 수 a, b에 대해서
a는 b의 값으로, b는 a를 b로 나눈 나머지 값으로 갱신하는 걸 반복한다. (~나머지 값으로 갱신된 b가 0이 될때까지)
public int gcd(int a, int b) {
while (b != 0) {
int r = a % b;
a = b;
b = r;
}
return a;
}
최소공배수 문제 팁
- 두 수 a, b의 최소공배수는 두 수를 곱한 값을 최대공약수로 나눈 값이다.
- 최소공배수(a, b) == (a*b / 최대공약수(a, b))
public int lcm(int a, int b) {
return (a * b / gcd(a, b));
}
코드
class Solution {
public int solution(int[] arr) {
int lcm = arr[0];
// 앞서 구해진 최소공배수와 새로운 값 간의 최소공배수 구하기
for (int i = 1; i < arr.length; i++) {
// 최대공약수
int gcd = gcd(lcm, arr[i]);
// 최소공배수 = 두 수의 곱 / 최대공약수
lcm = (lcm * arr[i] / gcd);
}
// 마지막으로 구해진 최소공배수 반환
return lcm;
}
public int gcd(int a, int b) {
while (b != 0) {
// 나머지 값
int r = a % b;
// gcd(a, b) == gcd(b, r)
a = b;
b = r;
}
return a;
}
}
728x90