반응형
약수
- x에 대해 정수로 나누어떨어지는 수
- 소수 : 1과 자기자신으로만 나누어 떨어지는 수
최대공약수
- 2개 이상의 자연수가 공통된 약수를 갖는 수
- 유클리드 호제법 : 최대공약수를 구하는 알고리즘
- 2개의 자연수 a,b에 대해서 (a>b 일 때) a를 b로 나눈 나머지를 r
- a 와 b의 최대공약수는 b와 r의 최대공약수와 같다.
- 이 과정을 나머지가 0이 되었을 때 까지 반복하여 얻는 수가 최대공약수
static int gcd(int a, int b) {
while (b != 0) {
int r = a % b;
a = b;
b = r;
}
return a;
}
- 유클리드 호제법 사용 - While 문으로 시간복잡도는 O(n)
static int gcd2(int a, int b) {
if (a % b == 0) return b;
return gcd2(b, a % b);
}
- 재귀함수 사용 시 시간복잡도는 O(logN)이 된다.
최소공배수
- 2개 이상의 자연수의 공통인 배수
- 최소공배수와 최대공약수의 관계
- 두 자연수 A,B 의 최대공약수 : G, 최소 공배수 L 일 때
- A = a x G, B = b x G (a,b는 서로소) 일 경우
- L = a x b x G , A x B = L x G
- 공식만 보면 어렵다.. 예시를 보자
- 18 과 24 를 비교
- 18 = gcd(24, 18) * 3
- 24 = gcd(24, 18) * 4
- 3 * 4 * gcd(24,18) = 최대공배수가 된다.
- 또는 18 * 24 / gcd (24, 18) 로 볼 수 있다.
static int lcm (int a, int b) {
return (a * b / gcd(a, b));
}
예제
- 두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다. - 프로그래머스
class Solution {
public int[] solution(int n, int m) {
int[] answer = new int[2];
if (n > m) {
answer[0] = gcd(n, m);
answer[1] = lcm(n, m);
}
else {
answer[0] = gcd(m, n);
answer[1] = lcm(m, n);
}
return answer;
}
static int gcd(int a, int b) {
while (b != 0) {
int r = a % b;
a = b;
b = r;
}
return a;
}
static int lcm(int a, int b) {
return a * b / gcd(a,b);
}
}
반응형