728x90
SMALL
백준 문제 풀이: 2702 (초6 수학)
문제 링크: https://www.acmicpc.net/problem/2702
문제 설명:
두 정수 a
와 b
가 주어졌을 때, **최소공배수**(LCM)와 **최대공약수**(GCD)를 구하는 문제입니다. 여러 개의 테스트 케이스를 입력받고 각각의 결과를 출력해야 합니다.
문제 해결 코드
#include <iostream>
using namespace std;
// 최대공약수(GCD)를 구하는 함수: 유클리드 호제법 사용
int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
// 최소공배수(LCM)를 구하는 함수
int lcm(int a, int b) {
return a * b / gcd(a, b); // a와 b의 곱을 GCD로 나눈 값
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int T;
cin >> T; // 테스트 케이스의 수 입력
while (T--) {
int a, b;
cin >> a >> b; // 두 정수 입력
cout << lcm(a, b) << ' ' << gcd(a, b) << '\n'; // LCM과 GCD 출력
}
return 0;
}
코드 설명
코드의 주요 로직과 사용된 알고리즘 설명:
- 최대공약수(GCD): - **유클리드 호제법**을 사용하여 두 수의 최대공약수를 구합니다. -
gcd(a, b) = gcd(b, a % b)
의 성질을 이용해 재귀적으로 계산합니다. - 최소공배수(LCM): - 두 수의 곱을 최대공약수로 나누어 최소공배수를 구합니다:
LCM(a, b) = (a × b) / GCD(a, b)
- 여러 테스트 케이스 처리: -
while (T--)
를 사용하여 각 테스트 케이스를 반복 처리합니다.
시간 복잡도 분석
- GCD 계산: 유클리드 호제법은 **O(log(min(a, b)))** 시간 복잡도를 가집니다.
- LCM 계산: GCD를 이용해 최소공배수를 계산하므로 추가 연산은 **O(1)**입니다.
- 총 시간 복잡도: **O(T ⋅ log(min(a, b)))**, 여기서
T
는 테스트 케이스의 수입니다.
결과
각 테스트 케이스마다 두 수의 **최소공배수**와 **최대공약수**를 출력합니다.
- 입력 예시:
3 6 9 2 5 100 10
- 출력 예시:
18 3 10 1 100 10
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 수학' 카테고리의 다른 글
백준 17103번 [골드바흐 파티션](C++) -yes6686- 티스토리 (0) | 2024.05.06 |
---|---|
백준 20004번 [베스킨라빈스 31](C++) -yes6686- 티스토리 (0) | 2024.05.06 |
백준 1834번 [나머지와 몫이 같은 수](C++) -yes6686- 티스토리 (0) | 2024.05.04 |
백준 2355번 [시그마](C++) -yes6686- 티스토리 (0) | 2024.05.04 |
백준 14921번 [용액 합성하기](C++) -yes6686- 티스토리 (0) | 2024.05.04 |