메모리: 33.4 MB, 시간: 0.09 ms
코딩테스트 연습 > 연습문제
정확성: 100.0
합계: 100.0 / 100.0
2025년 01월 07일 09:59:03
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
n | m | return |
---|---|---|
3 | 12 | [3, 12] |
2 | 5 | [1, 10] |
입출력 예 #1
위의 설명과 같습니다.
입출력 예 #2
자연수 2와 5의 최대공약수는 1, 최소공배수는 10이므로 [1, 10]을 리턴해야 합니다.
function solution(n, m) {
var answer = [];
// 최대공약수(GCD) 구하기
const gcd = (a, b) => {
while(b > 0) {
let temp = b;
b = a % b;
a = temp;
}
return a;
};
// 최소공배수(LCM) 구하기
const lcm = (a, b) => (a * b) / gcd(a, b);
answer.push(gcd(n, m)); // 최대공약수
answer.push(lcm(n, m)); // 최소공배수
return answer;
}
최대공약수 (GDC,Greatest common factor)
2개의 숫자를 받아서 조건식 세팅 (b가 0보다 크다면 계속 반복)
- temp라는 임시 변수에 b의 값을 할당.
- b에 a를 b로 나눈 나머지를 할당.
- a에는 기존 b의 값이었던 temp를 할당.
이 로직을 계속 반복하다가 b가 0과 같거나 작아지면 while문은 종료되고, 최종 a를 리턴하게 된다.
function gcdlcm(a, b) {
var r;
for(var ab= a*b;r = a % b;a = b, b = r){}
return [b, ab/b];
}
처음에 접근한 방식은.. 상당히 고전적이었는데, 최대공약수의 경우 각 수의 약수를 구해서 공통된 걸 찾고, 공배수의 경우 4개정도 경우의 수를 정리하고 If else 복수로 사용해 풀었다. 그렇다 보니까 다수의 테스트케이스에서 실패를 경험..
역시 다르게 푸는 방법이 있었다. 오히려 무궁무진..
새로운 변수에 두 수의 곱을 할당, r = a % b가 먼저 계산되고(하나의 수를 다른 수로 나눈 나머지를 새로운 변수에 저장), b는 a에 할당하고 그 나머지는 원래의 b에 할당.. 이걸 계속 반복하다 보면 r이 0이 될 때까지 반복하게 되고, 끝나면 최대공약수인 b와 두 수의 곱을 최대공약수로 나눈 최소공배수가 나오게 됨....
진짜 경악했던 코드였다. 아니 이게 저렇게 단 3줄로 끝난다고...
쓰면서 복습하는 오늘의 잡지식
- Math.max(), min() 메소드를 사용할 때 안에 배열이면 작동하지 않는다.
null을 return하게 되므로, 안에는 스프레드 operator 등을 활용해 숫자들만 넣어주기로 하자.
e.g. Math.min(1,2,3,..) -> 1
Math.max(배열명) X
Math.max(...배열명) O