문제 풀이/BOJ 문제 풀이
[BOJ알고리즘, C++]#1735_분수 합, 유클리드 호제법, 최대 공약수, 최소 공배수, gcd, lcm
Hardii2
2024. 6. 19. 16:33
#1. 문제
https://www.acmicpc.net/problem/1735
#2. 풀이
1. 유클리드 호제법
https://webddevys.tistory.com/162
[BOJ알고리즘, C++]#2609_최대 공약수와 최소 공배수, 유클리드 호제법
[BOJ 알고리즘, C++] #2609_최대 공약수와 최소 공배수, 유클리드 호제법 BOJ 알고리즘 문제 풀이, 2609_최대 공약수와 최소 공배수유클리드 호제법 알고리즘을 통해 두 자연수의 최대 공약수와
webddevys.tistory.com
int gcd(int a, int b)
{
int c = a%b;
while(c != 0)
{
a = b;
b = c;
c = a%b;
}
return b;
}
int lcm(int a, int b)
{
return (a * b)/ gcd(a, b);
}
유클리드 호제법은 2개의 자연수의 최대공약수(gcd)를 구하는 알고리즘의 하나입니다. A와 B를 나눈 나머지 값을 R이라고 한다면, A와 B의 최대 공약수는 B와 R의 최대 공약수와 같습니다! 이 성질을 이용하여, B(혹은 Determinant)를 이전의 나머지 값으로 나누는 작업을 반복합니다. 최종적으로, 나머지 값이 0이 되었을 때, "마지막 B" 값이 A와 B의 최대 공약수가 되는 것입니다.
2. lcm(분모1, 분모 2)/분모 1, lcm(분모 1, 분모 2)/분모 2
- 먼저, 두 분모의 lcm값을 찾아줍니다.
- 그리고, 각 분자에 lcm(분모 1, 분모2)/분모1, lcm(분모1, 분모 2)/분모 2해줍니다.
- 마지막으로, (분자/gcd(분자, 분모))/(분모/gcd(분자, 분모))로 표현해 준다.
#3. 코드
/*
@문제: 주어진 두 분수의 합을 기약 분수의 형태로 나타내는 문제
@설명
1. 유클리드 호제법: 최대 공약수
2. 먼저, 두 분수의 분모의 lcm(최소 공배수)를 찾아줍니다.
3. 그리고, 두 분수의 분자에 각각 lcm(분모1, 분모2)/분모1, lcm(분모1, 분모2)/분모2를 곱해주고, 이 둘의 합을 구합니다.
2. 마지막으로, (분자/gcd(분자,분모))/(분모/gcd(분자,분모))로 표현해준다.
*/
#include <iostream>
#include <vector>
using namespace std;
int A, B;
int gcd(int a, int b)
{
int c = a%b;
while(c != 0)
{
a = b;
b = c;
c = a%b;
}
return b;
}
int lcm(int a, int b)
{
return (a*b)/gcd(a,b);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
vector<pair<int,int>> v;
for(int i=0; i<2; ++i)
{
cin >> A >> B;
v.push_back({A,B});
}
// 분자 = 분자 * (LCM/분모)
int denominator = lcm(v[0].second, v[1].second);
int numerator = 0;
for(int i=0; i<2; ++i)
{
numerator += v[i].first * (denominator/v[i].second);
}
// (분자/분모와 분자의 최대 공약수) / (분모/분모와 분자의 최대 공약수)
int GCD = gcd(numerator, denominator);
cout << numerator/GCD << ' ' << denominator/GCD;
return 0;
}