N개의 최소공배수

peter.p·2022년 2월 9일

알고리즘

목록 보기
10/10

1차 시도.

우선 어떻게 하면 최소공배수 최대공약수를 구할 수 있는지를 찾아보고 혼자 만들어보았다.
나중에 깨달았는데 여기에 문제점이 있다..

function solution(n,m){
    let answer = []
    let big_num = 0
    let small_num = 0 

    if (n>m) {
        big_num = n
        small_num = m
    } else {
        big_num = n
        small_num = m
    }

    return  lcm(big_num, small_num)

    function gcd(n, m){
        if (n%m === 0) {  
        return answer.push(m) 
        } else {
            gcd(m, n%m)
        }
        return answer
    }
   

    function lcm(n, m){
      return  (n*m) / gcd(n, m)
    }
}

2차 시도.

위에서 최소공배수를 구하는 방법을 알았으니 주어진 배열에 있는 숫자들을 하나씩 가지고 와서 어떻게 원하는 값을 도출해내느냐가 관건.

solution 에서 배열의 첫번째 값을 고정으로 두고(arr[0]) 그 다음 배열의 값(arr[1])을 불러와서 최소공배수를 구하고 그 값을 result에 저장한다. 그리고 구해진 최소공배수를 그다음 값(arr[2])와 비교를 해서 또 최소공배수를 구해야 하기때문에 arr[0]는 result(구해진 최소공배수) 로 바꾸어줬다.

function callcm(n, m) {   // 8,4
    let answer = []
    let big_num = 0
    let small_num = 0 

    if (n>m) {
        big_num = n
        small_num = m
    } else {
        big_num = n
        small_num = m
    }

    return  lcd(big_num, small_num)

    function gcd(n, m){
        if (n%m === 0) {
        return answer.push(m)
        } else {
            gcd(m, n%m)
        }
        return answer
    }
   

    function lcd(n, m){
      return  (n*m) / gcd(n, m)
    }
}

function solution(arr){
    let result = 0
    for (let i=1; i<arr.length; i++){
        result = callcm(arr[0], arr[i])
        arr[0] = result
    }
    return result
}

완성한 줄 알았지만 문제점 발생.
주어진 값들은 잘 나오지만 정작 테스트를 실행했을 때는 전부 다 오류가 나왔다.

console.log() 를 찍어보다보니 알게 되었다.

최대공약수가 계속 1만 나온다.. 알고보니 gcd의 return 값인 answer이 배열로 되어있어서 그런 것.

3차 시도(완성).

배열을 숫자로 다시 바꿔줬더니 완만하게 해결.

다른 분들은 더 짧게 쓰셨던데 어떻게 하신 건지 볼 필요가 있을 거 같다.

function callcm(n, m) {   // 8,4
    let answer = 0
    let big_num = 0
    let small_num = 0 

    if (n>m) {
        big_num = n
        small_num = m
    } else {
        big_num = n
        small_num = m
    }

    return  lcm(big_num, small_num)

    function gcd(n, m){
        if (n%m === 0) {
         answer = m
        } else {
            gcd(m, n%m)
        }
        return answer
    }
   

    function lcm(n, m){
      return  (n*m) / gcd(n, m)
    }
}

function solution(arr){
    let result = 0
    for (let i=1; i<arr.length; i++){
        result = callcm(arr[0], arr[i])
        arr[0] = result
    }
    return result
}
profile
꼭 웹 퍼플리셔가 될거에요

0개의 댓글