코플릿/알고리즘

08_[GCD] 빼빼로 데이

테오구 2021. 12. 7. 17:57
728x90

문제

오늘은 빼빼로 데이입니다. 한 회사의 팀장은 출근길에 아몬드 빼빼로 M개와 누드 빼빼로 N개를 구매하여 아침 일찍 출근길에 나섰습니다.

팀장은 자신보다 먼저 출근해 있는 직원들에게 구매한 빼빼로를 전부 나누어 주려고 합니다. 단, 서로 질투하는 경우를 만들지 않기 위해 모든 직원들에게 공평하게 빼빼로를 나누어 주려고 합니다. 직원들은 각각의 빼빼로를 똑같은 개수만큼 받아야 합니다. 빼빼로를 쪼개서 줄 수는 없습니다.

하지만 회사에 도착하기 전이라 몇 명의 직원들이 있는지 모르는 상황입니다. 팀장이 아몬드 빼빼로를 4개, 누드 빼빼로를 8개를 구매 했다면, 다음과 같이 세 가지 방법으로 나누어 줄 수 있습니다.

  • 출근한 직원이 1명이라면 아몬드 빼빼로 4개와 누드 빼빼로 8개를 줄 수 있습니다.
  • 출근한 직원이 2명이라면 아몬드 빼빼로 2개와 누드 빼빼로 4개를 각각 줄 수 있습니다.
  • 출근한 직원이 3명이라면 빼빼로를 남기지 않고 공평하게 주는 방법은 없습니다.
  • 출근한 직원이 4명이라면 아몬드 빼빼로 1개와 누드 빼빼로 2개를 각각 줄 수 있습니다.

팀장은 출근한 직원 수에 따라 어떻게 빼빼로를 나누어 줄지 고민하고 있습니다. 여러분이 직원 수에 따라 빼빼로를 나누어 주는 방법을 구하는 솔루션을 제공해 주세요.

 

입출력 예시

let M = 4;
let N = 8;
let output = divideChocolateStick(M, N);
console.log(output);
// [[1, 4, 8], [2, 2, 4], [4, 1, 2]]

 

더보기
function gcd(x, y){
  return y === 0 ? x : gcd(y, x % y)
}

 

function divideChocolateStick(MN) {
  const result = []
  let a = gcd(NM)
  for(let i = 1; i <= Math.sqrt(a); i++){
    if(a % i === 0){
      result.push([i, M / i , N / i])
      if (i * i < a) {
        // 제곱근이 아닌 경우(제곱근 보다 작은)
        right = a / i; // 최대 공약수를 제곱근이 아닌 수로 나누면 제곱근 보다 큰 약수를 구할 수 있다.
        result.push([right, M / right, N / right]);
      }
    }
  }
  result.sort((op1, op2) => op1[0] - op2[0]);
  return result
}
728x90

'코플릿 > 알고리즘' 카테고리의 다른 글

07_[조합] 블랙잭은 지겨워  (0) 2021.12.07
06_[순열] 새로운 치킨 소스 레시피  (0) 2021.12.07
05_rockPaperScissors  (0) 2021.12.07
03_[구현] 보드 게임  (0) 2021.12.07
02_[Greedy] 편의점 알바  (0) 2021.12.07