오늘 약수 특집~~~ 오늘 약수 관련 문제 다 풀어버릴테다
문제 설명
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
제한 사항
두 수는 1이상 1000000이하의 자연수입니다.
숫자 하나의 약수를 구하는건 쉬웠는데 음... 최대공약수와 최소공배수는 어떻게 해야 할까?
일단 만약 최대공약수가 1인 경우에는 그냥 n과 m을 곱해서 배열에 넣어주면 될것 같다.
그럼 일단 최대공약수를 구하는 식을 생각해보자
for문으로 n과 m 중 작은 수 만큼 1부터 두 숫자를 나눠가면서
나누어떨어지는 수를 정답 배열에 push 해야 할것 같다.
추가로 최소공배수는 이 answer로 각각n과 m을 나눈 수를 곱해주고 거기다 최대공약수를 곱해주면 되지 않을까?
정리하자면
- n과 m 중 작은 수를 가려내는 식
- for문으로 작은수만큼 나누는 식 (&& 사용하면 괜찮을것 같다!)
2.1 제일 마지막 수를 정답배열에 push (최대공약수)- 2번에서 구한 최대공약수로 각 수를 나눈 수들끼리 곱하고 최대공약수를 다시 곱해준다
(이거는 식 다시 정리해서 깔끔하게 다듬을 수 있을것 같다.)
n - m ? n : m
음~ 잘 작동하는군 이걸 포문에 넣어버릴거다.
for (let i = 1; i <=(n - m ? n: m);i++) {
if (n % i === 0 && m % i === 0){
arr.push(i)
}console.log(arr)
}
제일 최종수만 넣어주고싶은데 방법 생각 안나서 ㅎㅎ 걍 최소공배수까지 넣어주고 slice 하는걸루~~
arr.push((m * n)/arr.slice(-1))
이러면 최소공배수도 배열에 들어가는데
이 후에
retuen arr.slice(-2)
최대공약수랑 최소공배수 자르는 식~~~
요렇게 하면 완벽쓰
나의 최종 답안
function solution(n, m) {
var arr = [];
for (let i = 1; i <=(n - m ? n: m);i++) {
if (n % i === 0 && m % i === 0){
arr.push(i)
}
} arr.push((m * n)/arr.slice(-1));
return arr.slice(-2);
}
4점 감사합니다...
나랑 풀이법 비슷한데 함수명이 무시무시했던 풀이법 ㅋㅋㅋㅋ
function greatestCommonDivisor(a, b) {return b ? greatestCommonDivisor(b, a % b) : Math.abs(a);}
function leastCommonMultipleOfTwo(a, b) {return (a * b) / greatestCommonDivisor(a, b);}
function gcdlcm(a, b) {
return [greatestCommonDivisor(a, b),leastCommonMultipleOfTwo(a, b)];
}
for문 신기하게 사용하는 사람의 풀이법
function gcdlcm(a, b) {
var r;
for(var ab= a*b;r = a % b;a = b, b = r){}
return [b, ab/b];
}
++ 포문을 거꾸로 돌리면 slice를 안써도 된다!!
그렇다면 내 답안 다시 개선해봐야지.
function solution(n, m) {
var arr = [];
for (let i = (n - m ? n: m); i > 0;i--) {
if (n % i === 0 && m % i === 0){
arr.push(i);
break;
}
} arr.push((m * n)/arr[0]);
return arr;
}
더 깔끔하게 개선 완!
(n - m ? n: m)이거 너무 좋은데요? 참고하겠습니다