[ Programmers ] N개의 최소 공배수 (Java)

ma.caron_g·2021년 12월 6일
0

Lv.2 - Programmers

목록 보기
1/14
post-thumbnail

1. Problem 📃

[ N개의 최소 공배수 ]

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


[ 문제 설명 ]

두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다.

예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다.

n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.


2. Constraint 🔗

[ 제한 사항 ]

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

3. Example 📚

[ 입출력 예시 ]

arrresult
[2, 6, 8, 4]168
[1, 2, 3]6

4. Solution 🔑


최소 공배수는 0이 아닌 두 수를 곱하여 나온 값을 두 수의 최대 공약수로 나누어주면 구할 수 있다.


  1. (문제 자체에서 테스트 케이스를 정렬 되 상태로 주어주어 생략해도 풀리긴 함)
    최소 공배수들을 구하기 위한 값들이 담긴 배열(arr)를 Arrays.sort(); 시켜 정렬한다.
    (시간이 더 늘어남)

  2. 최대 공약수를 구해 줄 메서드(gcd)를 만들어주었다.
    메서드(gcd)는 두 수를 매개 변수(매개 변수를 작은 수와 큰 수를 구분해준다.)로 입력 받았을 때, 들어온 작은 수를 큰 수로 나눈 나머지가 0이 될 때 까지 재귀함수로 호출하여 메서드(gcd)를 호출해주고 나눈 나머지가 0이 되었을 때 두 수의 최대 공약수를 반환한다.

  3. 반환되는 최대 공약수 값을 이용하여 최소 공배수를 구하는 식을 풀어준다.
    ( answer(최소 공배수) * 다음 배열 값 / gcd(answer, arr[i] )를 하여 최소 공배수를 담아간다.

  4. answer에 담겨진 최소 공배수를 입력 받은 다음 배열(arr) 값과 다시 메서드를 호출을 반복하여 배열(arr) 끝 값 까지 비교한다.
    (배열이 정렬 되어 있으므로, 메서드로 나온 최대 공약수 값은 배열의 다음 값보다 무조건 작은 값이 나올 것이므로 크기에 신경쓰지 말고 메서드(gcd(최대 공약수 값, 배열 값))에 넣어주면 된다.)
    앞 선 두 값의 최소 공배수와 다음 값과의 최소 공약수를 구하고 두 값을 곱한 값에 두 값의 최소 공약수를 나누어 최종 최소 공배수를 구하여 반환한다.

5. Code 💻

import java.util.ArrayList;
import java.util.Arrays;

class Solution {

	public int gcd(int n, int m) {
		if (m == 0) {
			return n;
		} else {
			return gcd(m, n % m);
		}
	}
	
	public 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;
	}
}

6. Growth 🍄

최대 공약수(gcd)값은
작은 값, 큰 값을 구분해주어 매개 변수로 받아 큰 값이 0이 될 때 까지 앞에는 큰 값을, 뒤에는 작은 값을 큰 값으로 나눈 나머지 값을 넣어 뒤에 값이 0이 될 때 까지 재귀함수로 계속 호출 해주면 된다.

두 수의 최소 공배수(lcm)값은 두 수의 곱을 두수의 최대 공약수(gcd)으로 나누어주면 구할 수 있다.
profile
다른 사람이 만든 것을 소비하는 활동보다, 내가 생산적인 활동을 하는 시간이 더 많도록 생활화 하자.

0개의 댓글