회사에서 프로그래머스 문제풀이 스터디를 시작하였다!
매주 각자 문제를 풀어가고, 좀 인상깊었던 문제는 각자의 풀이 방법을 공유하는 방식으로 하는데~~~
이번주는 코딩테스트 입문 day1~2까지 풀기
였고, 나머지는 다 사칙연산 관련 문제였는데 분수의 덧셈
문제가 푸는데 살짝 시간이 걸렸다.
문제는 간단했다. 두 분수의 덧셈을 기약분수로 나타내면 되는 것.
우선 두 가지 단계가 필수적이었다.
function solution(numer1, denom1, numer2, denom2) {
var answer = [];
// 분수를 더하기
let newNumer = numer1 * denom2 + numer2 * denom1;
let newDenom = denom1 * denom2;
}
하지만, 문제의 조건이 기약분수로 나타내는 것이고..
어렸을 때에도 기약분수로 만들어서 최종 제출하는 것이 원칙이었던 기억..
그러기 위해서는 분자, 분모가 더이상 약분이 되지 않는 형태로 나누어 져야 하는데
=== 분모, 분자를 최대공약수
로 나누자
function solution(numer1, denom1, numer2, denom2) {
var answer = [];
// 분수를 더하기
let newNumer = numer1 * denom2 + numer2 * denom1;
let newDenom = denom1 * denom2;
// 최대공약수를 구하기
let yaksu = 0;
// 분모와 분자 중 더 작은 수 구하기
const smaller = (newNumer < newDenom) ? newNumer : newDenom ;
for (i = 0; i <= smaller; i++) {
if (newNumer % i === 0 && newDenom % i === 0) {
yaksu = i;
}
}
// 분모, 분자를 최대공약수로 나누어주기
answer = [newNumer / yaksu, newDenom / yaksu];
return answer;
}
우선 for문을 사용한다는 것은 n의 개수에 따라 계산 횟수가 늘어나게 된다.
분모나 분자가 4자리수면,, 백만번 넘는 포문을 돌 수도..
유클리드 호제법
을 사용하는 것이다. 유클리드 호제법이 뭔데?
이름을 들으면 엥? 할 수도 있는데 사실 우리가 어렸을 때 배운 최대 공약수, 최소 공배수를 구하는 방식이 유클리드 호제법이다.
보통은 첨부된 캡처화면의 1번 방식을 사용해서 구해왔는데,
2번의 방식을 참고하여 이번 문제에 적용시킬 수 있다.
출처 : https://www.youtube.com/watch?v=R1gxRwXRpMQ
1번에 더하는 방식까지는 같지만, 유클리드 호제법을 사용하여 최대공약수를 구하는 getGcd라는 함수를 따로 구현하였다.
num1과 num2를 인자로 받았을 때, num1을 num2로 나눈 나머지가 0이면 num2를 반환하고, 그렇지 않으면 다시 그 나머지와 num2를 같은 방식으로 계속 계산해 나가는 것이다.
(캡처 그림 참고)
function solution(numer1, denom1, numer2, denom2) {
var answer = [];
let newNumer = numer1 * denom2 + numer2 * denom1;
let newDenom = denom1 * denom2;
const gcd = getGcd(newNumer, newDenom);
answer = [newNumer / gcd, newDenom / gcd];
return answer;
}
const getGcd = (num1, num2) => {
if (num1 % num2 === 0) return num2;
return getGcd(num2, num1 % num2);
};
다른 문제들도 보통 2-5배 차이가 나지만, 특히 1, 8, 9, 10번 같은 경우를 보면 그 시간 차이가 어마어마한 것을 알 수 있다.. 아마 파라미터로 들어오는 수가 엄청나게 큰 수 일 것이다.
(지금 제한사항에 1,000미만이라고 하였는데, 그럼에도 저정도면.. 10,000이 넘어가면???????????? for문을 사용하는 방법은 옳지 않음을 알 수 있음)
for문 사용한 방식
유클리드 호제법을 사용한 방식