Programmers / 최대공약수와 최소공배수 - 12940

y1nlog·2025년 1월 7일
0

[level 1] 최대공약수와 최소공배수 - 12940

문제 링크

성능 요약

메모리: 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]를 반환해야 합니다.

제한 사항
  • 두 수는 1이상 1000000이하의 자연수입니다.
입출력 예
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를 리턴하게 된다.

  • 최소공배수 (LCM,Lowest Common Multiple)
    입력받은 인자 2개의 곱을 최대공약수로 나눠주면 끝.

다른 사람의 풀이

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
profile
FrontEnd Developer

0개의 댓글