728x90
해당 문제는 최대공약수와 최소공배수가 주어지면,
주어진 최대공약수와 최소공배수를 만족시키는 두 수 A, B 중 A + B가 가장 작은 경우를 찾는 문제입니다.
접근 전략
- A X B 는 최대공약수 X 최소공배수 와 같습니다.
- 완전탐색으로 가능한 모든 경우의 수를 찾는다.
- 최대공약수의 배수들을 탐색한다.
- 최대공약수의 배수들 중 A X B 와 나누어 떨어지는 경우를 찾는다.
- 주어진 최대공약수와 탐색하는 수의 최대공약수가 같은 경우를 찾는다. (유클리드 호제법으로 최대공약수를 빠르게 찾을 수 있음)
- 이들 중 합이 가장 작은 수를 찾는다.
파이썬
def euclidean(a: int, b: int):
while b:
a, b = b, a % b
return a
def solution(gcd: int, lcm: int):
ab = gcd * lcm
A = gcd
B = lcm
for a in range(gcd, int(ab ** 0.5) + 1, gcd):
if ab % a == 0:
b = ab // a
if euclidean(a, b) == gcd:
if A + B > a + b:
A, B = a, b
print(A, B)
gcd, lcm = map(int, input().split())
solution(gcd, lcm)
자바
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
solution(Integer.parseInt(s[0]), Integer.parseInt(s[1]));
}
static void solution(int gcd, int lcm) {
long ab = (long) gcd * lcm;
int A = gcd;
int B = lcm;
for (int a = gcd; a <= Math.sqrt(ab); a += gcd) {
if (ab % a == 0) {
int b = (int) (ab / a);
if (getGCD(a, b) == gcd) {
if (A + B > a + b) {
A = a;
B = b;
}
}
}
}
System.out.println(A + " " + B);
}
static long getGCD(int a, int b) {
return b == 0 ? a : getGCD(b, a % b);
}
}
깃허브 전체 코드
728x90
'개발일지 > Algorithm' 카테고리의 다른 글
백준 - 1912 연속합 [DP] (0) | 2023.09.20 |
---|---|
백준 1등 - 14252 공약수열 [수학] (0) | 2023.09.20 |
백준 - 1978 소수 찾기 [정수론] (0) | 2023.09.09 |
백준 - 15736 청기 백기 [정수론] (0) | 2023.09.06 |
백준 - 1090 체커 [완전탐색] (0) | 2023.09.06 |