반응형
문제
두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있으며, 최소 공배수는 30이다.
두 자연수 A와 B가 주어졌을 때, A와 B의 최소공배수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 둘째 줄부터 T개의 줄에 걸쳐서 A와 B가 주어진다. (1 ≤ A, B ≤ 45,000)
3 1 45000 6 10 13 17
출력
첫째 줄부터 T개의 줄에 A와 B의 최소공배수를 입력받은 순서대로 한 줄에 하나씩 출력한다.
45000 30 221
알고리즘 분류
유클리드 호제법(euclidean), 수학(math), 정수론(number_theory)
힌트
a, b의 최소공배수는 절대값 a x b 를 최대공약수로 나눗값과 같다
a, b의 최대공약수는 절대값 a x b 를 최소공배수로 나눗값과 같다
최소공배수나, 최대공배수를 못구할경우 순환오류가 발생한다.
최대공약수는 유클리드 알고리즘으로 풀수있다. 두 양의정수 a>b 가정이 있으나
a<b일 때 a mod b ≡ a(a%b==a)이므로 Gcd(a,b)는 Gcd(b,a)를 호출하므로 자연스럽게 a와 b 위치가 바뀌게 된다.
int GCD(int a, int b) { int r = a % b; if (r == 0) { return b; } return GCD(b, r); }
소스코드
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer token = new StringTokenizer(br.readLine(), " ");
int T = Integer.parseInt(token.nextToken());
for (int i = 0; i < T; i++) {
token = new StringTokenizer(br.readLine(), " ");
int A = Integer.parseInt(token.nextToken());
int B = Integer.parseInt(token.nextToken());
bw.write(LCM(A, B) + "\n");
}
bw.flush();
}
// greatest common divisor
static int GCD(int a, int b) {
if (b == 0) return a;
return GCD(b, a % b);
}
// least common multiple
static int LCM(int a, int b) {
return (a * b) / GCD(a, b);
}
}
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
JAVA 백준 4890번 Tiles of Tetris, NOT! (0) | 2022.06.18 |
---|---|
JAVA 백준 9884번 Euclid (0) | 2022.06.18 |
JAVA 백준 2609번 최대공약수와 최소공배수 (0) | 2022.06.17 |
JAVA 백준 17087번 숨바꼭질 6 (0) | 2022.06.16 |
JAVA 백준 2798번 블랙잭 (0) | 2022.06.15 |
댓글