- ๋ฌธ์
๋ถ์ A/B๋ ๋ถ์๊ฐ A, ๋ถ๋ชจ๊ฐ B์ธ ๋ถ์๋ฅผ ์๋ฏธํ๋ค. A์ B๋ ๋ชจ๋ ์์ฐ์๋ผ๊ณ ํ์.
๋ ๋ถ์์ ํฉ ๋ํ ๋ถ์๋ก ํํํ ์ ์๋ค. ๋ ๋ถ์๊ฐ ์ฃผ์ด์ก์ ๋, ๊ทธ ํฉ์ ๊ธฐ์ฝ๋ถ์์ ํํ๋ก ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๊ธฐ์ฝ๋ถ์๋ ๋ ์ด์ ์ฝ๋ถ๋์ง ์๋ ๋ถ์๋ฅผ ์๋ฏธํ๋ค.
- ์ฝ๋
#include <iostream>
#include <vector>
using namespace std;
int gcdIter(int a, int b) {//์ต๋ ๊ณต์ฝ์ ๊ตฌํ๋ ํจ์
while (b) {
a %= b;
swap(a, b);
}
return a;
}
vector<int> addFountain(vector<int>& n1, vector<int>& n2) {
vector<int> result; //๋ ๋ถ์๋ฅผ ๋ํ ๊ฐ
int gcd;
result.assign(2, 0);
//๋ถ๋ชจ์ ์ต์ ๊ณต๋ฐฐ์ ๊ตฌํ๊ธฐ
gcd = gcdIter(max(n1[1], n2[1]), min(n1[1], n2[1]));
result[1] = n1[1] * n2[1] / gcd; //๊ณตํต ๋ถ๋ชจ ๊ตฌํ๊ธฐ
//๋ ๋ถ์๋ฅผ ๋ํ ๋ถ์์ ๋ถ์ ๊ตฌํ๊ธฐ
n1[0] *= result[1] / n1[1];
n2[0] *= result[1] / n2[1];
result[0] = n1[0] + n2[0];
//๊ธฐ์ฝ ๋ถ์์ธ์ง ํ์ธ
int i = gcdIter(max(result[0], result[1]), min(result[0], result[1]));
if (i != 1) { //๊ธฐ์ฝ ๋ถ์๊ฐ ์๋๋ฉด
result[0] /= i;
result[1] /= i;
}
return result;
}
int main()
{
vector<int> n1; // ์ฒซ๋ฒ์งธ ๋ถ์
vector<int> n2; // ๋๋ฒ์งธ ๋ถ์
vector<int> result; //๋ ๋ถ์๋ฅผ ๋ํ ๋ถ์
n1.assign(2, 0);
n2.assign(2, 0);
//์
๋ ฅ
cin >> n1[0] >> n1[1];
cin >> n2[0] >> n2[1];
//์ฐ์ฐ
result = addFountain(n1, n2);
//์ถ๋ ฅ
cout << result[0] << " " << result[1];
return 0;
}
- ํด์ค
1. gcdIter ํจ์
- ์ต๋ ๊ณต์ฝ์๋ฅผ ๊ตฌํ๋ ํจ์
2. addFountain ํจ์
- ๋ ๋ถ์๋ฅผ ๋ํ๋ ํจ์
: gcdIter ํจ์๋ฅผ ์ด์ฉํด ๊ฐ ๋ถ์์ ๋ถ์, ๋ถ๋ชจ๋ฅผ ๋ฐ์์จ ๋ฒกํฐ n1 , n2์์ ๋ถ๋ชจ์ ์ต๋ ๊ณต์ฝ์๋ฅผ ๊ตฌํจ
: ๋ ๋ถ๋ชจ์ ๊ณฑ์ ์ต๋ ๊ณต์ฝ์๋ก ๋๋์ด ์ต์ ๊ณต๋ฐฐ์๋ฅผ ๊ตฌํด ๊ณตํต ๋ถ๋ชจ๋ฅผ ๊ตฌํจ
: ๋ ๋ถ์์ ๋ถ์๋ฅผ ๊ณตํต ๋ถ๋ชจ์ ๋ง๋ ๋ถ์๋ก ๋ง๋ค์ด์ฃผ๊ธฐ ์ํด ๊ณตํต๋ถ๋ชจ์ ๊ฐ ๋ถ๋ชจ๋ฅผ ๋๋ ๊ฐ์ ๋ถ์์ ๊ณฑํด์ค
: ๊ทธ๋ ๊ฒ ๊ตฌํ ๋ถ์๋ฅผ ๋ํด์ result์ ๋ถ์ ๊ฐ์ ๋ฃ์ด์ค
: ๊ธฐ์ฝ๋ถ์์ธ์ง ํ์ธํ๊ธฐ ์ํด result์ ๋ถ๋ชจ์ ๋ถ์์ ์ต๋๊ณต์ฝ์๋ฅผ ๊ตฌํจ
: ๋ง์ฝ ์ต๋ ๊ณต์ฝ์๊ฐ 1์ด ์๋๋ผ๋ฉด ๊ธฐ์ฝ ๋ถ์๊ฐ ์๋๋ฏ๋ก ๊ฐ ๋ถ๋ชจ์ ๋ถ์๋ฅผ ์ต๋๊ณต์ฝ์๋ก ๋๋์ด์ฃผ์ด ๊ธฐ์ฝ๋ถ์๋ก ๋ง๋ค์ด ์ค
: result ๋ฒกํฐ๋ฅผ return ํจ
3. main ํจ์
: ๋ ๋ถ์๋ฅผ n1, n2 ์ ์ ๋ ฅ ๋ฐ๊ณ addFountain ํจ์๋ฅผ ์ด์ฉํด ๋ ๋ถ์๋ฅผ ๋ํ ๊ฐ์ result์ ์ ์ฅํจ