문제
소스코드
지우지 말고 이 폰트로 글을 작성할 것!(폰트가 사라짐)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#include<iostream>
int GCD(int lhs, int rhs) {
//lhs에 큰값
if (rhs > lhs) {
std::swap<int>(rhs, lhs);
}
while (rhs != 0) {
int n = lhs % rhs;
lhs = rhs;
rhs = n;
}
return lhs;
}
int LCM(int lhs, int rhs) {
return lhs*rhs / GCD(lhs, rhs);
}
int main() {
int lhs{}, rhs{};
std::cin >> lhs>>rhs;
std::cout << GCD(lhs, rhs) << "\n";
std::cout << LCM(lhs, rhs) << "\n";
}
|
후기
이 문제를 해결하기 위한 키워드는 유클리드 호제법이다.
유클리드 호제법 또는 유클리드 알고리즘은 2개의 자연수의 최대공약수를 구하는 알고리즘이다.
lhs, rhs 두 개의 정수가 있으며 lhs> rhs라는 가정하에 lhs를 rhs로 나눈 나머지 값이 N이라고 하면 lhs와 rhs의 최대공약수는 rhs와 N의 최대공약수와 같다는 성질을 이용해서 rhs의 나머지가 0이 될 때까지 이 과정을 반복하며 나오는 값이 lhs과 rhs의 최대공약수이다.
최소공배수는 이 GCD 값을 lhs*rhs 으로 나누면 된다.
알고리즘 자체는 어렵지 않지만 짧은 시간 안에 많은 문제를 풀어야 했던 회사 시험 문제에 나왔던 기억이 나서 다시 풀어보았다.
출처 및 레퍼런스
문제 링크: https://www.acmicpc.net/problem/2609
관련 글
Wiki:https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95
'온라인 코딩 > 수학(Math)' 카테고리의 다른 글
[백준] 2756번 다트 (0) | 2020.10.10 |
---|---|
[백준] 1475번 방 번호 (0) | 2020.07.17 |
[프로그래머스] 콜라츠 추측 (0) | 2020.06.26 |
[백준] 17386번 선분 교차 1 (0) | 2020.05.01 |
[백준] 11758번 CCW (0) | 2020.04.23 |