코딩 테스트 연습/프로그래머스 level 0

[프로그래머스] lv0. 유한소수 판별하기 (JS)

카누가 좋아요 2023. 6. 25. 17:59

❓ 문제

코딩테스트 연습 - 유한소수 판별하기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

💡 해결하기

1️⃣ 분모와 분자의 최대공약수를 구하고 그것으로 분모를 나누어 기약분수 상태에서의 분모의 수를 구한다.

문제에서 나온 유한소수 조건을 보면 기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 한다고 하였으므로 분모에만 집중하면 된다. 따라서 기약분수 상태의 분모만 필요하다.

그리고 최대공약수를 구할 때는 유클리드 호제법을 재귀로 나타낸 함수를 사용하였다.

 

2️⃣ 분모의 소인수가 2와 5만 존재하는지 확인한다.

분모의 소인수가 2와 5만 존재하는지 확인하기 위해서는 분모가 2로 나누어 떨어질 때까지 분모를 2로 나누고, 분모가 5로 나누어 떨어질 때까지 분모를 5로 나누면 된다.

이렇게 하여 최종 계산 결과가 1이라면 소인수가 2와 5밖에 존재하지 않는 것이고, 1이 아니라면 2와 5 이외에 다른 소인수가 존재하는 것이다.

 

* 소인수: 약수 중에서 소수인 약수

 

 

 

💻 JS로 코드 작성해보기

 

// 분모와 분자의 최대공약수 구하기
function GCD(a, b) {
  if (a % b === 0) {
    return b;
  } else {
    return GCD(b, a % b);
  }
}

// 분모의 소인수가 2와 5만 존재하는지 판단하기
function Judge(b) {
  while (b % 2 === 0) {
    b /= 2;
  }
  while (b % 5 === 0) {
    b /= 5;
  }
  if (b === 1) return 1;
  else return 2;
}

function solution(a, b) {
  const gcd = GCD(a, b);     // 분모와 분자의 최대공약수 gcd
  b /= gcd;     // 분모를 gcd로 나누어 기약분수에서의 분모의 숫자로 만들기
  return Judge(b);     // Judge 함수에서 반환되는 값이 답
}