문제 해석
첫번째 줄에는 입력받을 두 자연수(A, B)쌍의 개수(T)을 입력받아 두 자연수(A, B)의 쌍의 개수(T)만큼 입력받는
다.
두 자연수(A, B)쌍의 개수(T)개 만큼 입력받았다면 각각의 두 자연수(A, B)의 최소 공배수 각각 구하면 된다.
최소 공배수란 두 수에 서로 공통으로 존재하는 배수 중 가장 작은 수를 의미한다.
보통, 최소 공배수를 구하는 방식은 A의 약수를 모두 구하고, B의 약수를 모두 구해서 공통된 약수들만 서로 곱해주면 된다.
하지만, 이러한 경우는 어떤 수가 클 경우 그것을 인수분해하는데 시간이 너무 많이 소요된다는 것이다.(두수의 공통 약수를 모두 찾아 다시 곱해줘야하는...)
-> 이러한 문제점을 해결하기 위해 나온 최대공약수 or 최소공배수를 사용하기 위한 알고리즘을 방식이 유클리드 호제법이다.
정리
큰 수를 작은 수로 나눈다.
나누는 수를 나머지로 계속 나눈다.
나머지가 0이 나오면 나누는 수가 최대공약수이다.
코드
import java.io.*;
import java.util.*;
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));
int T = Integer.parseInt(br.readLine());
for(int i = 0; i < T; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
bw.write(A*B/findGCD(A, B) +"\n");
}
br.close();
bw.flush();
bw.close();
}
//최대 공약수 구하기
static int findGCD(int A, int B){
/*
GCD(A, B) = GCD(B, R) = GCD(R, R1) = GCD(R1, R2) = ... = GCD(Rn, 0)
=> Rn이 최대 공약수
*/
while(B != 0){ //B가 0이 되기 전까지 반복(나머지가 0일때까지)
int R = A%B; //나머지 저장
A = B; //B를 A에 저장
B = R; //A에 B를 저장
}
return A;
}
}
결과
느낀 점