백준-Node.js-2609, 최대공약수와 최소공배수

송철진·2023년 2월 21일
0

백준-Node.js

목록 보기
32/69

풀이

const fs = require('fs');
const [a, b] = fs.readFileSync("/dev/stdin").toString().trim()
                 .split(' ').map(Number) ;

const solution = (a, b) => {
  const prime = Object.keys(primeObj(a*b))
  let [pA, pB] = [primeObj(a), primeObj(b)]
  let max = 1
  
  prime.forEach(el => {
    if(pA[el] && pB[el]){
      pA[el] > pB[el] ? 
        max *= el**pB[el] : max *= el**pA[el]
    }
  })
  return max + '\n' + a*b/max
}

const primeObj = num => {
  let i = 2
  let obj = {}
  while(num >= i){
    if(num % i === 0){
      obj[i] = ( obj[i] || 0 ) + 1
      num /= i
    }else{
      i++
    }
  }
  return obj
}

console.log(solution(a, b))
  1. 자연수를 입력하면 소인수(키)-제곱수(값) 쌍을 가지는 객체를 반환하는 함수 primeObj를 선언한다.
  2. 입력받은 두 수(a, b)를 각각 primeObj에 넣어 반환된 객체를 pA, pB 라고 한다.
  3. 최대공약수 max를 만들려면 pA와 pB에 모두 존재하는 요소를 가장 작은 것 제곱수만큼 곱하면 된다.
    👉 모든 소인수를 알기 위해 a*b를 primeObj에 넣어 객체 prime을 만들었다.
  4. 최소공배수는 max * a/max * b/max = a*b/max 이다.

다른 풀이

const fs = require('fs');
const [a, b] = fs.readFileSync("/dev/stdin").toString().trim()
                 .split(' ').map(Number) ;

const solution = (a,b) => {
  const smaller = Math.min(a, b);
  
  for (let i = smaller; i > 0; i--) {
    if (a % i === 0 && b % i === 0) {
      return i +'\n'+ a * b / i
    }
  }
}

console.log(solution(a,b));	

최대공약수 ismaller 이하의 자연수 중 a, b에 모두 나누어 떨어지는 최대값이다.
최소공배수는 a * b / i 이다.

profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글