최대공약수(GCD)와 최소공배수(LCM)의 원리 탐구
/ 8분 분량 / 문제 풀이
1934번 문제를 풀기 위해 최대공약수(GCD)와 최소공배수(LCM)의 원리를 파고들었습니다. 왜 유클리드 호제법을 사용하는지, 그리고 GCD와 LCM이 어떤 관계를 가지는지 이해하게 되었습니다.
최대공약수(GCD)와 최소공배수(LCM)의 원리 탐구
1934번 문제를 풀기 위해 최대공약수(GCD)와 최소공배수(LCM)의 원리를 파고들었습니다. 왜 유클리드 호제법을 사용하는지, 그리고 GCD와 LCM이 어떤 관계를 가지는지 이해하게 되었습니다.
학습 주제
- 오늘 공부한 주제: 최대공약수(GCD)와 최소공배수(LCM)의 수학적 원리
- 대화 제목: 최대공약수 최소공배수 원리
- 학습 날짜: 2026년 2월 3일
질문과 탐구
"1934번 문제 풀이를 위해 최대공약수를 구하고 그걸로 최소공배수를 구하는 것이 맞는지, 그리고 그 원리가 무엇인지"에 대한 궁금증에서 시작했습니다. 특히, 왜 최대공약수(GCD)를 알아야 최소공배수(LCM)를 구할 수 있는지, 그리고 유클리드 호제법이 왜 효율적인지에 대해 탐구했습니다.
주요 질문은 다음과 같았습니다.
- 최소공배수(LCM)는 어떻게 정의되는가?
- LCM과 GCD는 어떤 관계가 있는가?
- 유클리드 호제법의 원리는 무엇이며, 왜 GCD를 구할 때 사용하는가?
GCD(a, b) = GCD(b, a % b)성질이 왜 성립하는가?LCM(a, b) = (a * b) / GCD(a, b)공식이 어떻게 유도되는가?
핵심 학습 내용
GCD와 LCM의 핵심 원리를 명확히 할 수 있었습니다.
1. 최대공약수 (GCD)와 유클리드 호제법
- GCD 정의: 두 수 의 공통된 약수 중 가장 큰 수입니다.
- 유클리드 호제법: GCD를 구하는 효율적인 알고리즘입니다.
- 원리: 일 때,
GCD(a, b) = GCD(b, a % b)라는 나머지 성질을 이용합니다. - 작동 방식: 나머지가 0이 될 때까지
GCD(b, a % b)를 반복하며, 마지막으로 0이 아닌 나머지가 바로 GCD가 됩니다. - 예시:
GCD(18, 12)18 = 12 * 1 + 6→GCD(12, 6)12 = 6 * 2 + 0→GCD(6, 0)- 나머지가 0이 되었으므로, GCD는 6입니다.
- 원리: 일 때,
GCD(a, b) = GCD(b, a % b)가 성립하는 이유:- 일 때, 와 를 동시에 나누는 수 는 와 도 동시에 나눕니다. (즉, 이고 이면 이고, 이므로 입니다.)
- 반대로 와 을 동시에 나누는 수 는 도 나눕니다. (즉, 이고 이면 이므로 입니다.)
- 따라서, 와 의 공약수 집합과 와 의 공약수 집합은 동일하므로, 최대공약수 또한 같습니다.
2. 최소공배수 (LCM)와 GCD의 관계
- LCM 정의: 두 수 를 모두 나누는 가장 작은 양의 정수입니다.
- GCD와의 관계 공식:
- 직관적 이해:
- 와 를 곱하면, 이 안에는 두 수의 공약수가 두 번 중복되어 포함됩니다.
GCD(a, b)로 나누어주면, 중복된 공약수 부분이 한 번만 남게 되어 최소공배수가 됩니다. 마치 "겹친 부분을 펼쳐 바른 상태"와 같습니다.
3. 코드 구현 (C++)
AI는 유클리드 호제법으로 GCD를 구하고, 이를 활용하여 LCM을 구하는 C++ 함수를 제공했습니다.
// a와 b의 최대공약수를 구하는 함수 (유클리드 호제법)
int gcd(int a, int b) {
while (b != 0) { // 나머지가 0이 될 때까지 반복
int r = a % b; // a를 b로 나눈 나머지 r 계산
a = b; // a를 b로 바꿔서 다음 반복 준비
b = r; // b를 나머지 r로 바꿔서 다음 반복
// 핵심: GCD(a, b) == GCD(b, r) 성질 이용
}
return a; // 나머지가 0이 되면 a가 최대공약수
}
// a와 b의 최소공배수를 구하는 함수
int lcm(int a, int b) {
// 핵심 원리: LCM(a, b) = a*b / GCD(a, b)
// overflow 위험을 줄이기 위해 a / gcd(a, b) 먼저 계산
return (a / gcd(a, b)) * b;
}
a * b를 먼저 계산하면 정수 오버플로우가 발생할 수 있으므로, (a / gcd(a, b)) * b 순서로 계산하는 것이 더 안전합니다. 큰 수를 다룰 때는 long long 자료형을 사용하는 것이 좋습니다.
이해한 내용
이번 대화를 통해 GCD와 LCM에 대한 개념이 명확해졌습니다.
- 새로 알게 된 것:
GCD(a, b) = GCD(b, a % b)의 수학적 증명 과정을 직관적으로 이해하게 되었습니다. 또한,LCM(a, b) = (a * b) / GCD(a, b)공식이 왜 그렇게 유도되는지에 대한 설명이 매우 명확했습니다. - 이전에 몰랐던 것과 연결: 이전에는 단순히 공식을 외워 사용했지만, 이제는 그 공식이 왜 성립하는지에 대한 깊은 이해를 바탕으로 자신감 있게 사용할 수 있게 되었습니다. 나머지 연산의 성질과 약수의 관계를 통해 수학적 원리가 어떻게 실제 알고리즘으로 이어지는지 연결고리를 찾았습니다.
- 개념 정리:
- GCD: 두 수를 동시에 나누는 가장 큰 수. 유클리드 호제법으로 효율적으로 계산 가능.
- LCM: 두 수를 동시에 나눌 수 있는 가장 작은 수. GCD를 이용해 로 계산 가능.
실전 적용
이 지식은 프로그래밍 문제 해결에 매우 유용하게 적용될 수 있습니다.
- 적용 분야:
- 코딩 테스트 문제 (예: 1934번 문제처럼 두 수의 LCM을 구해야 하는 경우)
- 수학적 알고리즘 구현
- 자료구조나 알고리즘에서 GCD/LCM 계산이 필요한 부분
- 실습 계획:
- 주어진
gcd와lcm함수를 사용하여 다양한 테스트 케이스에 대한 결과를 확인해볼 것입니다. long long자료형을 사용하여 더 큰 수를 다루는gcd와lcm함수를 직접 구현해볼 계획입니다.
- 주어진
- 응용 아이디어:
- 여러 개의 수에 대한 GCD 및 LCM을 구하는 함수를 만들어볼 수 있습니다.
- 이 알고리즘을 활용하여 다른 수학적 난제를 해결하는 데 적용해 볼 수 있습니다.
추가 학습 계획
- 더 깊이 공부하고 싶은 부분:
- 유클리드 호제법의 시간 복잡도 분석.
- 확장 유클리드 알고리즘 (Extended Euclidean Algorithm)을 통한 선형 디오판토스 방정식 해 구하기.
- 관련 자료 찾기:
- 수학 관련 위키백과 페이지 (유클리드 알고리즘, 최대공약수, 최소공배수).
- 프로그래밍 알고리즘 관련 서적이나 온라인 강의.
- 다음 학습 주제: 확장 유클리드 알고리즘의 원리와 실제 적용 사례를 탐구해보고 싶습니다.
참고 자료
- AI와의 대화에서 언급된 참고 자료:
GCD(a, b) = GCD(b, a % b)성질에 대한 수학적 증명LCM(a, b) = (a * b) / GCD(a, b)공식의 유도 과정