# 프로그래머스 : N개의 최소공배수 (Level 3)
[문제]
[풀이]
우선 최대공약수, 최소공배수의 개념을 명확하게 알아야 할 것 같았다.
손으로 풀때랑, 실제 코드 상으로(수학적 공식으로) 적는 것은 차이가 있었는데,
- 최대 공약수
- 두 수의 공약수 중 가장 큰 수 (이건 누구나 알고 있는 개념)
- 나머지가 0이 나올 때 까지 제수를 나머지로 다시 나누는 방법을 반복 (몰랐다!)
최대 공약수를 구하는 2번째 방법을 식으로 정리해보면,
- x % y != 0 이면, y % (x % y)
- y % (x % y) != 0 이면, (x % y) % {y % (x % y)}
- 2번의 동작을 m % n == 0일 때 까지 반복
이를 코드로 표현하면 다음과 같다.
long long gcd (long long x, long long y) {
if(x%y == 0) return y;
else return gcd(y, x%y);
}
그렇다면 최소 공배수는 어떻게 표현할 수 있을까?
- 최소 공배수
- 두 수의 공배수 중 가장 작은 수 (이것 또한 누구나 알고 있는 개념)
- 두 수의 곲을 최대 공약수로 나눈 수 (몰랐다!!)
최소 공배수를 구하는 2번째 방법을 코드로 표현하면 다음과 같다.
long long lcm (long long x, long long y) {
return (x * y) / gcd(x,y);
}
그러므로 최종 식을 표현하면,
long long nlcm(vector<int> num)
{
long long answer = 0;
sort(num.begin(), num.end(), greater<int>());
for(int i=0; i<num.size(); i++) {
if(i==0) answer = num[i];
else {
if(answer > num[i]) answer = lcm(answer, num[i]);
else answer = lcm(num[i], answer);
}
}
return answer;
}
여기서 sort 함수는 자동으로 배열 내의 원소를 정렬해주는 API이다.
전달 값 중에서 greater<int>는 배열 내 원소를 내림 차순으로 정렬하겠다는 의미이다.
배열을 처음부터 돌아가면서 큰 수부터 차례대로 최소 공배수를 확인하는 방식이다.
댓글
댓글 쓰기