관리 메뉴

Tree's 개발일기

[자바]N개의 최소공배수 본문

문제풀이/프로그래머스

[자바]N개의 최소공배수

tree0123 2023. 7. 29. 14:30
728x90

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

 

프로그래머스

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

programmers.co.kr

유클리드 호제법

유클리드 호제법 증명

이 증명은 B와 R(A를 B로 나눈 나머지)가 공통된 최대공약수(G)를 갖는다는 것을 증명하면 된다.

그래서 B= Gb와 R=G(a-bq)에서 b와 (a-bq)가 서로소임을 보여주면 된다. 

이를 증명하기 위해 두 값이 서로소가 아님을 가정한다. 그 가정은 모순이 생기고, 따라서 b와 (a-bq)가 서로소이다.

그래서 A와 B의 최대공약수는 B와 R의 최대공약수와 같다는 유클리드 호제법이 성립한다.


이 유클리드 호제법을 사용해서 N개 숫자의 최소공배수를 구해야한다.

(for문으로 2개의 수끼리 계속 나누면 시간효율성이 좋지 않기 떄문)

이를 위해서는 만약 N이 3이상이면, 2개씩 짝지어가며 최소공배수를 구한다. 

-> 점점 최소공배수를 불려가면, N개 수의 최소공배수를 구할 수 있다.  

 

import java.util.*;
class Solution {
    public int solution(int[] arr) {
        int answer = 0;
        //최소공배수 반환
        //최대공약수를 먼저 구해서, 그걸로 나눈 값들을 모두 곱한다
        if (arr.length ==1) {
            answer=arr[0];
        }
        int g = gcd(arr[0], arr[1]); //최대공약수
        answer = (arr[0]*arr[1])/g;
        
        if (arr.length>2) {
            for (int i=2; i<arr.length; i++) {
                int temp_g = gcd(answer, arr[i]);
                answer = (answer*arr[i])/temp_g;
            }
        }
        
        return answer;
    }
    public static int gcd(int first, int second) {
        int value = first%second;
        if (value==0) {return second;}
        else {return gcd(second,value);} //재귀이기 때문에 gcd()재귀함수를 반환
    }
}
728x90

'문제풀이 > 프로그래머스' 카테고리의 다른 글

[자바] [1차] 캐시  (0) 2023.08.12
[자바] 최솟값 만들기  (0) 2023.08.10
[자바] 방금그곡  (0) 2023.07.29
[자바] 타겟넘버  (0) 2023.07.29
[자바] JadenCase 문자열 만들기  (0) 2023.07.28
Comments