컴퓨터 공학/백준
[백준] JAVA 자바 : 최소공배수 (1934번)
kim-dev
2024. 1. 21. 22:58
반응형

앞에서 GCD와 LCM을 찾는 문제를 풀었지만…
문제를 다시 보니 이상하게 나만 300ms대가 나오는 것이었다… 분명 다른 분들은 80~150ms가 걸리시는데… 왜 나만 이렇게 비효율적이게 돌아가는 거지??
그래서 다른 분들의 코드를 참조했는데, 나는 바보같이 for문을 계속 돌려서 GCD와 LCM을 찾았지만 유클리드 호제법으로 더 간단하게 GCD와 LCM을 찾을 수 있었다.
유클리드 호제법
GCD: 두 수 a와 b를 받으면, a에서 b를 나눈 나머지가 0이될 때의 b가 GCD이다. 0이 나올 때까지 반복하면 된다.
LCM: 두 수 a와 b를 받으면, a와 b를 곱한 값에서 GCD를 나눈 값이 LCM이다. ((a*b) / gcd)
import java.io.*;
public class LCM_1934 {
// 유클리드 호제법으로 구하는 gcd, lcm
// a와 b를 나눈 나머지가 0이 될 때 작은 수가 gcd이다
public static int gcd(int a, int b) {
while (b > 0) {
int tmp = a;
a = b;
b = tmp % b;
}
return a;
}
// 유클리드 호제법으로 lcm을 구하려면 a, b를 곱한 값에서 gcd를 나누면 된다
public static int lcm(int a, int b) {
return a*b/gcd(a,b);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = stoi(br.readLine());
int a, b;
for (int i=0; i<T; i++) {
String str = br.readLine();
a = stoi(str.split(" ")[0]);
b = stoi(str.split(" ")[1]);
sb.append(lcm(a, b)).append("\n");
}
System.out.println(sb);
br.close();
}
public static int stoi(String str) {
return Integer.parseInt(str);
}
}
로그인
www.acmicpc.net
작성일자: 2023-09-09