문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/120808
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
첫 번째 분수의 분자와 분모를 뜻하는 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] |
입출력 예 설명
입출력 예 #1
1 / 2 + 3 / 4 = 5 / 4입니다. 따라서 [5, 4]를 return 합니다.
입출력 예 #2
9 / 2 + 1 / 3 = 29 / 6입니다. 따라서 [29, 6]을 return 합니다.
나의 풀이
function solution(numer1, denom1, numer2, denom2) {
var answer = [];
let denom= denom1*denom2; //두 분모의 공배수
let numer= (numer1*denom2) + (numer2*denom1);
let gcd=1 //최대공약수
for(let i=2; i<= Math.min(denom,numer); i++){
if(denom%i===0 && numer%i===0) gcd=i;
}
answer.push(parseInt(numer/gcd));
answer.push(parseInt(denom/gcd));
return answer;
}
- 분모끼리 곱해준 후 denom 변수에 할당. 분자도 그에 맞춰 곱하고 더해준 후 numer 변수에 할당.
- 분자와 분모의 최대공약수(gcd)를 구한다. (기약분수는 분자와 분모의 공약수가 1로, 그 두 수의 최대 공약수로 나누어주면 된다)
- gcd 구하기: 두 수 중 작은 수까지 정수를 검사하면서 두 수를 나눈 나머지가 모두 0인 수를 구한다.
- 마지막으로 분자, 분모 각각을 약분해준 후, parseInt()로 정수로 만들어 answer배열에 push.
다른 사람 풀이
function fnGCD(a, b){
return (a%b)? fnGCD(b, a%b) : b;
}
function solution(denum1, num1, denum2, num2) {
let denum = denum1*num2 + denum2*num1;
let num = num1 * num2;
let gcd = fnGCD(denum, num); //최대공약수
return [denum/gcd, num/gcd];
}
- 내 풀이와 같은 원리지만 최대공약수를 구하는 함수가 더 간결함.
배운 점
- 재귀함수는 여전히 어렵다.. 원리를 파악하기가..
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 Lv.0] 연속된 수의 합 - 자바스크립트 풀이, javaScript (0) | 2023.07.22 |
---|---|
[프로그래머스 Lv.0] 다음에 올 숫- 자바스크립트 풀이, javaScript (0) | 2023.07.21 |
[프로그래머스 Lv.0] OX퀴즈 - 자바스크립트 풀이, javaScript (0) | 2023.07.21 |
[프로그래머스 Lv.0] 최빈값 구하기- 자바스크립트 풀이, javaScript (0) | 2023.07.20 |