<프로그래머스 C++> n개의 최소공배수 (유클리스 호제법)
2026. 6. 17. 11:52ㆍProgrammers
문제
n개의 수들의 배수 중 공통이 되는 가장 작은 최소공배수를 구하는 문제이다.

풀이 아이디어
두 수의 최소공배수는 아래 공식으로 구할 수 있다.
LCM(a, b) = a * b / GCD(a, b)
GCD는 최대공약수, LCM은 최소공배수이다.
이 공식을 이용해서 구해볼 것이다.
GCD와 LCM
GCD(최대공약수)
두 수를 모두 나눌 수 있어야 하므로 공통 인수 중에서 작은 것을 택한다.
12 = 2² × 3
8 = 2³
공통 인수: 2
2²로 나누면 → 12/4=3, 8/4=2 (true)
2³으로 나누면 → 12/8=1.5 (false)
GCD = 2² = 4
LCM(최소공배수)
두 수를 모두 담을 수 있어야 하므로 공통 인수 중에서 큰 것을 택한다.
12 = 2² × 3
8 = 2³
2³ × 3 = 24
24 / 12 = 2 (true)
24 / 8 = 3 (true)
LCM = 2³ × 3 = 24
문제 풀이
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int Gcd(int a, int b) {
while(b) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int Lcm(int a, int b)
{
return a / Gcd(a, b) * b;
}
int solution(vector<int> arr) {
int answer = arr[0];
for(int i = 1; i < arr.size(); ++i)
answer = Lcm(answer, arr[i]);
return answer;
}
코드 흐름
1. GCD - 유클리드 호제법
int Gcd(int a, int b) {
while(b) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
GCD(a, b) = GCD(b, a%b) 원리를 반복문으로 구현했다.
b가 0이 되는 순간의 a가 최대공약수이다.
예시로 a = 12, b = 8일 때의 코드의 흐름을 표현하면 다음과 같다.
a=12, b=8 → temp=8, b=12%8=4, a=8
a=8, b=4 → temp=4, b=8%4=0, a=4
a=4, b=0 → 종료
return 4
2. LCM()
int Lcm(int a, int b)
{
return a / Gcd(a, b) * b;
}
a * b / GCD 의 공식을 사용한다.
a * b를 먼저 계산하면 Overflow가 발생할 수 있으므로 먼저 나누고 곱하는 순서로 작성했다.
3. n개의 LCM 계산
int answer = arr[0];
for(int i = 1; i < arr.size(); ++i)
answer = Lcm(answer, arr[i]);
첫 번째 원소를 초기값으로 설정하고, 두 수씩 순서대로 LCM을 적용한다.
핵심 포인트
- GCD는 유클리드 호제법 GCD(a, b) = GCD(b, a % b)으로 구한다.
- LCM 공식은 a * b / GCD(a, b)이며, overflow 방지를 위해 a / GCD * b 순서로 계산한다.
- n개의 LCM은 두 수씩 순서대로 LCM을 적용한다.
'Programmers' 카테고리의 다른 글
| <프로그래머스 C++> 귤 고르기 풀이 (unordered_map, greedy) (0) | 2026.06.22 |
|---|---|
| <프로그래머스 C++> 멀리 뛰기 풀이 (피보나치) (0) | 2026.06.18 |
| <프로그래머스 C++> 예상 대진표 풀이 ( ceil() ) (0) | 2026.06.16 |
| <프로그래머스 C++> 카펫 풀이 (브루트포스) (0) | 2026.06.15 |
| <프로그래머스 C++> 피보나치 수 풀이(재귀 함수) (0) | 2026.06.12 |