[JAVA]백준 1934번 - 최소공배수

닥개·2025년 5월 7일

공부

목록 보기
23/23

❓문제

두 자연수 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)
첫째 줄부터 T개의 줄에 A와 B의 최소공배수를 입력받은 순서대로 한 줄에 하나씩 출력한다.


지피티가 최적화 해준 코드

1) O(log N) 시간복잡도로 LCM 계산 가능
2) 반복문 없고 break 조건도 없음 → 깔끔
3) 큰 수가 나와도 안정적으로 처리


import java.util.*;
import java.io.*;

class Main {
    public static int gcd(int a, int b) {
        while (b != 0) {
            int temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < T; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();

            int lcm = a * b / gcd(a, b);
            sb.append(lcm).append("\n");
        }

        sc.close();
        System.out.print(sb);
    }
}

비효율적인 나의 풀이

이 부분은 a1의 배수를 하나씩 만들어가며 a2로 나누어 떨어지는지 확인하는 방식이야.
최악의 경우엔 a2번 반복하므로, 시간복잡도는 O(N) 수준이 되고, T가 커지면 총 반복이 많아져 시간초과 위험이 생길 수 있어.

import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        ArrayList<Integer>  arr1 = new ArrayList<>();
        ArrayList<Integer>  arr2 = new ArrayList<>();
        
        for (int i=0;i<T;i++) {
            arr1.add(sc.nextInt());
            arr2.add(sc.nextInt());
        }
        sc.close();

        StringBuilder sb = new StringBuilder();

        int a1,a2;
        for(int k=0;k<T;k++){

            if (arr1.get(k)<arr2.get(k)) {
                a1= arr1.get(k);
                a2= arr2.get(k);
            } else {
                a1= arr2.get(k);
                a2= arr1.get(k);
            }
            if (a1<2||a2<2) {
                sb.append(a1*a2).append("\n");
                continue;
            }
            for(int i=1;i<=a2;i++){
                if(a1*i%a2<1){
                    sb.append(a1*i).append("\n");
                    break;
                }
            }
        }
        System.out.println(sb);
    }
}


profile
발바닥부터 시작하는 코딩공부

0개의 댓글