문제 설명
첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 0 < numer1, denom1, numer2, denom2 < 1,000
입출력 예
| numer1 | denom1 | numer2 | denom2 | result |
| 1 | 2 | 3 | 4 | [5,4] |
| 9 | 2 | 1 | 3 | [29,6] |
나의 풀이
·처음 풀이
function solution(numer1, denom1, numer2, denom2) {
let answer = [];
let numer = numer1 * denom2 + numer2 * denom1 //분자를 모두 더함
let denom = denom1 * denom2 //분모를 모두 더함
let gcd = 1;
//최소공약수 구하기
for(let i = 2; i <= Math.min(denom1,denom2); i++){
if(denom1 % i === 0 && denom2 % i === 0){
gcd = i;
}
}
answer[0] = numer / gcd
answer[1] = denom / gcd
return answer;
}
위의 코드로 짰더니 정확성이 33.3% 가 나왔다.
다른 사람들의 질문을 참고하며 고려하지 못했던 부분을 찾았다.
· 약분이 되지 않음
이 점을 고려해 약분을 할 수 있는 코드를 추가했다.
if(a % b == 0 || b % a == 0){
let min = Math.min(a,b)
a = a / min;
b = b / min
}
해당 코드를 넣어도 정확성이 50% 길래 뭐가 문제인가 찾지 못해서 질문했더니
여전히 약분이 부족하다는 답을 들을 수 있었다.
·최종코드
function solution(numer1, denom1, numer2, denom2) {
let answer = [];
let numer = numer1 * denom2 + numer2 * denom1 // 분자를 모두 더함
let denom = denom1 * denom2 //분모를 모두 곱함
let g = 1; //최소공약수가 될 변수
//최대공약수 구하는 법
for(let i = 0; i <= Math.min(numer,denom); i++){
if(numer % i === 0 && denom % i === 0){
g = i;
}
}
//최대공약수로 약분
let a = numer / g
let b = denom / g
return answer = [a,b]
}
약분이 되어야 하는 변수는 numer과 denom 이였는데 엉뚱하게 denom1과 denom2의 최대공약수를 구하고 있으니 틀린 거 였다!
최대공약수를 만드는 for문의 변수를 변경하여 최종 완성하였다
다른 사람의 풀이
·유클리드 호제법
: 두 양의 정수 a,b(a>b) 일 때, a와 b의 최대공약수는 b와 a/b의 나머지의 최대 공약수와 같다!
function solution(numer1, denom1, numer2, denom2) {
let answer = [];
let numer = numer1 * denom2 + numer2 * denom1 //일단 분자를 모두 더함
let denom = denom1 * denom2 // 분모를 모두 곱함
function gcd (denom1,denom2){
while(denom2 > 0){
let r = denom1 % denom2; //두 수의 나머지 구하기
denom1 = denom2;
denom2 = r;
}
return denom1
}
let g = gcd(numer, denom)
//약분(이 과정이 빠져있으면 틀렸다고 나옴)
let a = numer / g
let b = denom / g
return answer = [a,b]
}