티스토리 뷰

반응형

안녕하세요,

 

오늘은 난이도 2의 'N개의 최소공배수'를 가져왔습니다!! 

 

풀었던 저의 주관적인 풀이를 공유하고자 합니다!


문제 설명

두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.


  • 제한 사항
    • arr은 길이 1이상, 15이하인 배열입니다.
    • arr의 원소는 100 이하인 자연수입니다.

입출력 예

 

arr result
[2,6,8,14] 168
[1,2,3] 6

우선 이 문제같은 경우에는

 

최소공배수를 구하는 방식에 대해 알고있어야 좀 수월하게 풀 수 있습니다.

 

좀 쉽게 풀어서 설명을 하자면

 

[4, 6, 7]의 최소 공배수를 구하려 한다면, 어떠한 최소 공배수를 N이라 가정했을때 N % 4, N % 6, N % 7을 했을때 모두 0으로 떨어져야 합니다. 왜냐하면 모두 4와 6, 7의 배수로 이루어진 수이기 때문이죠

 

이 방식을 이용한다면 미지의 n을 설정해두고, 배열중 하나의 수 (여기서는 arr[0])에 n을 곱하여 나온 수를 나머지 arr를 돌면서 나머지를 계산했을때, 나머지가 0이 나오는 최초의 수가 최소공배수가 되는 것입니다.

 

코드화 한다면 다음과 같을 것입니다.

 

function solution(arr) {
  let flag = false
  let n = 0
  while(!flag){
    n++
    for(let i = 1; i<arr.length; i++){
      if(arr[0] * n % arr[i] === 0){
        flag = true
      } else {
        flag = false
        break
      }
    }
  }

  return n * arr[0];
}

flag라는 변수를 만든 이유는, while문 종료를 위해 만들어 두었습니다. arr[0]과 미지의 n을 곱한 수를 나머지 index로 나누었을 때 0이 된다면 flag를 true로 변환해줍니다. 하지만, 만약 하나라도 0이 아니라면 flag는 다시 false로 변경되며 while문을 실행하게 될 것입니다.

 

그리고 하나라도 나머지가 0이 아니라면 최소 공배수가 될 수 없기때문에, break문으로 이후의 처리를 하지 않고 나오게 구현하였습니다.

 

문제 자체는 어렵지 않지만, 최소 공배수를 구하는 방식에 대해 이해하고 있지 않다면 나름 어려울 수도 있지 않을까 생각합니다..

 

여기까지.. N개의 최소 공배수 문제였습니다

 

다른 풀이들도 한번 방문해주세요~

 

한솔방울 깃허브

 

이상 감사합니다!!

반응형