Problem/Programmers
[Programmers] 120808번 분수의 덧셈
NeNemEee
2023. 2. 7. 01:39
728x90
문제설명
첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
0 <numer1, denom1, numer2, denom2 < 1,000
문제풀이
유클리드 호제법
두 양의 정수 a,b (a>b)a,b (a>b)에 대하여 a=bq+r (0≤r<b)a=bq+r(0≤r<b)이라 하면, a,ba,b의 최대공약수는 b,rb,r의 최대공약수와 같다. 즉, gcd(a, b)=gcd(b, r)
gcd(a, b)=gcd(b, r)에서 r=0이라면, a,b의 최대공약수는 b가 된다.
풀이 과정
- 분모와 분모를 곱한다.
- 분자에 다른 분수의 분모를 곱한다.
- 곱한 두 분수를 더한다.
- 유클리드 호제법을 이용하여 분자와 분모의 최대공약수를 구한다.
- 최대공약수로 분자와 분모를 나누어 answer 벡터에 넣고 반환한다.
소스코드
#include <string>
#include <vector>
using namespace std;
int GCD(int x, int y){
if(x%y == 0){
return y;
}else{
return GCD(y, x%y);
}
}
vector<int> solution(int numer1, int denom1, int numer2, int denom2) {
vector<int> answer;
int numer, denom;
numer = numer1 * denom2 + numer2 * denom1;
denom = denom1 * denom2;
int gcd = GCD(numer, denom);
answer.push_back(numer/gcd);
answer.push_back(denom/gcd);
return answer;
}
728x90