1 minute read


입출력 예시

Input-1
[2, 6, 8, 14]
Output-1
168

Input-2
[1, 2, 3]
Output-2
6


문제 풀이

문제의 핵심은 앞의 두 수를 가지고 구한 최소공배수를 가지고 다음 수와의 최소공배수를 구하는 방식으로 구해나가야 한다는 것이다.

먼저 최소공배수의 경우 두 수의 곱을 두수의 최대공약수로 나누면 된다.
최대공약수의 경우는 유클리드 호제법 함수를 통해 구하였다.

1
2
3
4
5
public static int gcd(int bn, int sn) { // 유클리드 호제법을 통해 최대공약수 찾기
    int r = bn % sn;
    if(r == 0) return sn;
    else return gcd(sn, r);
}

다음으로 N번째까지의 최소공배수를 구하기 위해 아래의 작업을 반복해야 한다.

  • (이전 최소 공배수 * 다음 수) / GCD(이전 최소 공배수, 다음 수)
1
2
3
4
5
Arrays.sort(arr);
int answer = arr[0];
for(int i=1; i<arr.length; i++) {
    answer = (answer * arr[i]) / gcd(answer, arr[i]);
}

위 코드는 최소공배수를 구해나가는 과정을 작성한 것이다.
첫번째 수의 값을 answer에 담아서 반복문 내에서 첫번째 수를 대입한 후에는 구해진 최소공배수가 answer에 담겨져 위의 작업을 이행할 수 있게 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
arr [2, 6, 8, 14]

i = 1 //6일 때
    answer = arr[0] = 2
    gcd = (2,6) = 2
    answer = (2*6)/2 = 6

i = 2 //8일 때
    answer = 6
    gcd = (6,8) = 2
    answer = (6*8)/2 = 24

i = 3 //14일 때
    answer = 24
    gcd = (24,14) = 2
    answer = (24*14)/2 = 168


작성 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.*;

class Solution {
    public static void main(String[] args) {        
        int[] arr = {2,6,8,14};
        // int[] arr = {1,2,3};
        long start = System.currentTimeMillis();
        solution(arr);
        long end = System.currentTimeMillis();
        System.out.println("\n수행시간 = " + (end-start));
    }
    
    public static int solution(int[] arr) {
        Arrays.sort(arr);
        int answer = arr[0];
        for(int i=1; i<arr.length; i++) {
            answer = (answer * arr[i]) / gcd(answer, arr[i]);
        }
        return answer;
    }
    
    public static int gcd(int bn, int sn) { // 유클리드 호제법을 통해 최대공약수 찾기
        int r = bn % sn;
        if(r == 0) return sn;
        else return gcd(sn, r);
    }
}

회고

  • 이전에 두수의 최대공약수와 최소공배수를 구하는 문제를 풀어보았기에 쉽게 문제풀이에 접근할 수 있었다.