내가 생각했을때 문제에서 원하는부분
첫째 줄에 테스트 케이스의 개수 n이 주어진다.
다음 n개 줄에는 a와 b가 주어진다.
a와 b사이에는 공백이 하나 이상 있다.
두 수는 백만보다 작거나 같은 자연수이다.
각 테스트 케이스에 대해서 입력으로 주어진 두 수의 최소공배수를 출력한다.
내가 이 문제를 보고 생각해본 부분
BufferedReader와 StringBuilder 객체를 생성한다.
StringBuilder는 여러 줄의 출력을 효율적으로 처리하기 위해 사용한다.
첫 줄에서 테스트 케이스의 개수 n을 읽는다.
n번 반복하면서 각 테스트 케이스를 처리한다.
br.readLine()으로 한 줄을 읽고, StringTokenizer를 사용하여 공백으로 구분된 두 수 a와 b를 읽는다.
이 값들은 long 타입으로 변환한다.
lcm(a, b) 함수를 호출하여 최소 공배수를 계산하고, 결과를 StringBuilder에 추가한다.
각 결과 뒤에는 개행 문자(\n)를 붙인다.
모든 테스트 케이스 처리가 끝나면 StringBuilder에 저장된 내용을 System.out.print로 한 번에 출력한다.
br.close()를 호출하여 리소스를 해제해준다.
gcd 함수: 두 수 a와 b의 최대 공약수를 유클리드 호제법을 사용하여 계산한다.
lcm 함수: gcd 함수를 이용하여 두 수의 최소 공배수를 계산합니다. (a / gcd(a, b)) * b 형태로 계산하여 중간 과정에서 발생할 수 있는 오버플로우를 방지했다.
코드로 구현
package baekjoon.baekjoon_28;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 백준 5347번 문제
public class Main1019 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine()); // 테스트 케이스의 개수 n 입력
for(int i = 0; i < n; i++) {
// a와 b 입력
StringTokenizer st = new StringTokenizer(br.readLine());
long a = Long.parseLong(st.nextToken());
long b = Long.parseLong(st.nextToken());
sb.append(lcm(a, b)).append('\n'); // 최소 공배수 계산 및 결과 저장
}
System.out.println(sb.toString()); // 결과 출력
br.close();
}
public static long gcd(long a, long b) { // 최대 공약수 (GCD) 계산 함수 - 유클리드 호제법 사용
while(b != 0) {
long temp = b;
b = a % b;
a = temp;
}
return a;
}
// 최소 공배수 (LCM) 계산 함수
// LCM(a, b) = (a * b) / GCD(a, b)
// 오버플로우를 방지하기 위해 곱셈 전에 나눗셈을 먼저 수행합니다.
public static long lcm(long a, long b) {
// a * b 계산 시 long 범위를 벗어날 수 있으므로,
// (a / gcd(a, b)) * b 와 같은 형태로 계산하는 것이 안전합니다.
// 문제의 제약 조건 (100만 이하)에서는 a*b가 long 범위 안에 들어오므로
// (a * b) / gcd(a, b) 형태도 가능합니다.
// 여기서는 오버플로우 방지에 더 안전한 형태로 구현합니다.
return (a / gcd(a, b)) * b;
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.