프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
이번 문제는 N개의 숫자가 주어졌을 때 해당 수들의 최소공배수를 구하는 문제이다.
예를 들어 2,7의 최소공배수는 14라는것을 모두들 알 것이다.
해당 문제에서는 n개의 숫자가 담긴 int형 배열 arr이 제공된다.
기존에 알고있던 공식을 이용하여 문제를 풀어보았다.
ex > a,b라는 정수가 있는 경우
(ab의 최소공배수 = a * b / a,b의 최대공약수) 의 공식을 이용하여 풀어낼 수 있다.
하지만 이는 3개 이상의 수를 한번에 계산하는 방식으로는 옳지 못하다 판단하였다.
이에 해당하는 반례를 찾아보았다.
{4,6,8} 이라는 값이 주어진 경우 해당 공식을 이용하여 문제를 풀게되면
최소공배수 = 4*6*8 / 2 라는 값을 가지게 된다.
이렇게 되면 잘못된 최소공배수의 값인 96을 반환한다.
이러한 연유로 2개의 숫자씩 각각 계산을 하기로 결정하였다.
완성된 해당 코드는 이러하다.
public static int solution(int[] arr) {
int lcmValue = arr[0]; // 최소공배수를 저장할 변수
// 배열 내 모든 숫자에 대해 최소공배수 계산
for (int i = 1; i < arr.length; i++) {
lcmValue = lcm(lcmValue, arr[i]);
}
return lcmValue;
}
최소공배수를 저장할 lcmValue라는 변수를 하나 선언해 주었고 lcm이라는 메서드를 형성하여 실행시키도록 만들어주었다.
// 최소공배수(LCM) 구하기
private static int lcm(int a, int b) {
return (a * b) / gcd(a, b);
}
lcm메서드는 2개의 값을 이용하여 최소공배수를 구하는 공식을 적용한 메서드이다.
해당 메서드에서 매개변수로 받아와지는 a,b 두값의 최대공약수를 구하기 위해 gcd라는 메서드도 구현하였다.
// 최대공약수(GCD) 구하기 (유클리드 호제법)
private static int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
기존 알고있던 공식을 검색해보니 lcm, gcd라는 이름이 붙여진 유클리드 호제법이라는 이름이 있었다.
해당 gcd메서드는 나머지가 0이 될때까지 나머지연산을 반복하여 두 값의 최대공약수를 구해내는 방식이다.
이렇게 간단한 지식 하나만으로 여러가지 수가 주어졌을 때의 최소공배수를 구하는 방법을 알아보았다.
'코딩테스트' 카테고리의 다른 글
| 프렌즈 4블록 (0) | 2025.02.24 |
|---|---|
| 방금 그곡 (0) | 2025.02.21 |
| 피로도 (0) | 2025.02.20 |
| 2018 KAKAO BLIND RECRUITMENT [1차 캐시] (0) | 2025.02.18 |
| 피보나치 수열(프로그래머스) (0) | 2025.02.17 |