본문 바로가기

알고리즘

프로그래머스[12953] - N개의 최소공배수(lv2)

반응형

문제는 여기서!

https://school.programmers.co.kr/learn/courses/30/lessons/12953

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제설명

더보기

두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.

제한 사항

  • arr은 길이 1이상, 15이하인 배열입니다.
  • arr의 원소는 100 이하인 자연수입니다.

입출력 예

arr result
[2,6,8,14] 168
[1,2,3] 6

문제해결 keyPoint

  1. 유클리드 호제법은 그냥 외우자
  2. A,B,C 가 있을때 A,B의 최소공배수 L과 C의 최소공배수는 A,B,C 의 최소공배수와 같다.

20220929 1차시도

더보기

최소공배수, 최대공약수를 구하는 법은 또 까먹어서.. 그냥 풀이를 참고했다.

사실 최소공배수, 최대공약수 문제를 예전에 머리 쥐어 뜯어가며 풀었었는데, 그렇게 스스로 풀어도 잊어먹는다 ㅋㅋㅋㅋㅋㅋ 그냥 여러번 보고 외워버리는게 나은듯!

import java.util.*;
class Solution {
    public int solution(int[] arr) {
        /**
         * 1. arr로 제공되는 수들의 공배수중 최소 공배수를 구해라
         * 2. 최소공배수를 구하는 함수를 계속 돌리면 되지 않을까?...
         * 3. 사실상 for문으로 O(n)이긴 한데... 흠.. 일단 한번 해보자.
         * 4. 그런데 최소공배수를 어떻게 구하더라?...
         * 5. 이것도 재귀함수로 배울수 있을까?..
         */
        int answer = 0;
        int lcd = this.getLCM(arr[0],arr[1]);

        for(int i=1; i< arr.length-1; i++){
            lcd = this.getLCM(lcd,arr[i+1]);
        }
        answer = lcd;

        return answer;
    }

    /**
     * 최소공배수를 구하자!
     * @param num1
     * @param num2
     * @return
     */
    public int getLCM(int num1, int num2){
        int lcd = 0;
        int max = Math.max(num1,num2);
        int min = Math.min(num1,num2);
        if(max%min==0){
            return max;
        }
        lcd = num1*num2/this.getGCD(num1,num2);
        return lcd;
    }

    public int getGCD(int num1, int num2){
        while(num2!=0){
            int r = num1%num2;
            num1= num2;
            num2= r;
        }
        return num1;
    }
}
반응형