-
[프로그래머스 / JS] Lv.0 분수의 덧셈Algorithm/프로그래머스 2022. 12. 19. 14:56반응형
문제 설명
첫 번째 분수의 분자와 분모를 뜻하는 denum1, num1, 두 번째 분수의 분자와 분모를 뜻하는 denum2, num2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 0 <denum1, num1, denum2, num2 < 1,000
풀이
function solution(denum1, num1, denum2, num2) { let num = denum1 * num2 + denum2 * num1; let denum = num1 * num2; for (let i = 2; i <= Math.min(num,denum); i++) { if ((num / i < 1) || (denum / i < 1)) break if ((num % i === 0) && (denum % i === 0) && (i != 1)) { [num, denum, i] = [num / i, denum / i, i-1] } } return[num, denum] }
function solution(denum1, num1, denum2, num2) { let num = denum1 * num2 + denum2 * num1; let denum = num1 * num2; let getGcd = (bigNum, smallNum) => { if (bigNum % smallNum === 0) return smallNum else return getGcd(smallNum, bigNum % smallNum) } let gcd = getGcd(num,denum) return [num / gcd, denum / gcd] }
사고과정
- 더한 수의 분자 분모 값을 변수에 저장하자
- 2부터 분자 분모 중 작은수까지의 자연수로 분자 분모를 나눠보고 나머지가 0이면 분자 분모값을 갱신하면 되겠는데?
- 같은 값이 반복될 가능성도 있으니 값을 갱신할 때 for문에서 반복을 위해 사용한 인자값도 -1을 더해 갱신하자
- 일단 코드가 돌긴 하는데 너무 느리네...
- 유클리드 호제법이 있네 이걸 적용해보자
- ? 를 쓰면 가독성이 안좋으니까 if문으로 나누는게좋겠다. 함수 구현은 제귀를 써야겠다.
- 효율성이 훨씬 개선됐고만
평가
구현에는 성공했으나 보다 효율성있는 알고리즘의 존재를 뒤늦게 깨달아 헛고생을 했다. 이건 여러번 부딪혀 보고 코드의 효율성을 개선하는 방법을 찾아보면서 익히는 수 밖에 없겠다.
개선점
알게된점
- 최대공약수를 구할 땐 유클리드 호제법을 사용하자
- for 루프 마지막에 continue를 쓰면 오히려 효율성이 떨어진다.
반응형'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / JS] Lv.1 문자열 나누기 (0) 2022.12.20 [프로그래머스 / JS] Lv.1 가장 가까운 글자 (0) 2022.12.20 [프로그래머스 / JS] Lv.0 최빈값 구하기 (0) 2022.12.15 [프로그래머스 / JS] Lv.0 외계행성의 나이 (0) 2022.12.13 [프로그래머스 / JS] Lv.0 구슬을 나누는 경우의 수 (0) 2022.12.13