문제 : 첫 번째 분수의 분자와 분모를 뜻하는 denum1, num1, 두 번째 분수의 분자와 분모를 뜻하는 denum2, num2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
입출력 예 :
denum1 | num1 | denum2 | num2 | result |
1 | 2 | 3 | 4 | [5, 4] |
9 | 2 | 1 | 3 | [29, 6] |
이번 문제는 어려웠다 ㅜㅜ
처음에는 조건문으로 접근을 했는데 경우의 수가 너무 많고 분수의 성질 상 8/16이라는 값이 나오면 1/2로 만들어야 한다. 그런데 그렇게 만들기 위해선 조건문에 반복문을 넣고 또 반복문 안에 조건문을 넣어야 했다. 그런데 그렇게 하면 코드가 너무 무거워진다는 단점이 나온다. 오히려 답을 제출하면 타임 아웃이 나올 것이다.
그래서!! 생각을 바꿔서 수학적으로 접근을 했다. 그러니 해답이 보이기 시작했다.
분모(num)를 num1 * num2하고 분자(denum)는 denum1 * num2 + denum2 * num1를 하면 분수의 합을 구할 수 있다. 그 후 분모(num)와 분자(denum)의 최소 공배수를 구하고 분모(num)와 분자(denum)에 각 각 곱하면 해당된 는 값이 출력되었다.
최소 공배수는 두 수를 배열에 넣고 반복문을 이용해 작은 숫자만큼 반복하게 하고 i는 1씩 커지게 한 뒤 둘 다 나머지가 0을 만들어 주는 가장 큰 값을 출력했다.
function solution(denum1, num1, denum2, num2) {
let answer = [];
let gcd = 0;
const denum = denum1 * num2 + denum2 * num1;
const num = num1 * num2;
const arr = [denum, num];
for(let i = 1; i <= Math.min.apply(null, arr); i++) {
if ((Math.min.apply(null, arr)%i == 0) && (Math.max.apply(null, arr)%i == 0)) {
gcd = i }
}
answer.push(denum / gcd, num / gcd);
return answer;
}
'프로그래머스 JS LV0' 카테고리의 다른 글
LV0 12 짝수 홀수 개수 (0) | 2022.10.10 |
---|---|
LV0 11 머쓱이보다 키 든 사람 (0) | 2022.10.10 |
LV0 09 가장 큰 수 찾기 (0) | 2022.10.10 |
LV0 08 배열 원소의 길이 (0) | 2022.10.10 |
LV0 07 피자 나눠 먹기 (3) (0) | 2022.10.07 |