저장을 습관화

프로그래머스 LV.0 유한소수 판별하기 본문

코딩 테스트/프로그래머스 - 자바스크립트

프로그래머스 LV.0 유한소수 판별하기

ctrs 2024. 2. 25. 09:11

프로그래머스 LV.0 유한소수 판별하기

https://school.programmers.co.kr/learn/courses/30/lessons/120878

 

프로그래머스

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

programmers.co.kr

 

1. 문제 명

유한소수 판별하기


2. 문제 설명

소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.

기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.

두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.


3. 제한 사항

a, b는 정수

0 < a ≤ 1,000

0 < b ≤ 1,000


4. 예시

a b result
7 20 1
11 22 1
12 21 2

 

4-1. 힌트

분자와 분모의 최대공약수로 약분하면 기약분수를 만들 수 있습니다.

정수도 유한소수로 분류합니다.


5. 기본 제공 코드

function solution(a, b) {
    var answer = 0;
    return answer;
}


6. 제출한 내 답

const solution = (a, b) => {
  const 최대공약수 = (a, b) => {
    for (i = Math.min(a, b); i >= 1; i--) {
      if (a % i === 0 && b % i === 0) return i;
    }
  };
  let gcd = 최대공약수(a, b);

  a = a / gcd;
  b = b / gcd;

  let 소인수 = [];
  let 인수 = 2;
  while (b >= 2) {
    if (b % 인수 === 0) {
      소인수.push(인수);
      b /= 인수;
    } else {
      인수 += 1;
    }
  }
  return 소인수.filter((v) => v !== 2 && v !== 5).length === 0 ? 1 : 2;
};

 

6-2. VSC에 작성한 내용

const solution = (a, b) => {
  /**
   * a/b가 유한소수이면 1
   * 무한소수라면 2를 반환
   * 주어진 분수를 기약분수로 나타내었을때,
   * 분모의 소인수가 2와 5만 존재한다면 이는 유한 소수이다.
   * 정수도 유한소수로 분류한다.
   */
  const 최대공약수 = (a, b) => {
    for (i = Math.min(a, b); i >= 1; i--) {
      if (a % i === 0 && b % i === 0) return i;
    }
  };
  let gcd = 최대공약수(a, b);

  // 기약분수화
  a = a / gcd;
  b = b / gcd;

  // 분모의 소인수가 2와 5만 존재하는가?
  // 그렇다면 유한소수이다.
  let 소인수 = [];
  let 인수 = 2;
  while (b >= 2) {
    if (b % 인수 === 0) {
      소인수.push(인수);
      b /= 인수;
    } else {
      인수 += 1;
    }
  }
  return 소인수.filter((v) => v !== 2 && v !== 5).length === 0 ? 1 : 2;
};

// test;
console.log(solution(7, 20)); // 1
console.log(solution(11, 22)); // 1
console.log(solution(12, 21)); // 2
console.log(solution(8, 16)); // 1
console.log(solution(31, 14)); // 2


7. 특이사항

꼼수로 풀려고 하다가 실패한 한법

const solution = (a, b) => {
  return (a / b).toString().split(".")[1].length >= 15 ? 2 : 1;
};

자바스크립트는 소수점 이하 숫자 16자까지 표시하니까 찔러봤는데

4번과 8번 문제에서 런타임 에러가 나오고

34번과 44번 문제가 틀렸다고 나왔다.

 

다시 문제 설명과 힌트를 따라가니 쉽게 풀 수 있었다.


8. 다른 사람이 작성한 답

8-1. 내 코드와 순서는 같으나 훨씬 깔끔하게 작성한 코드

function solution(a, b) {
    let n = 1;
    for (let i = 1; i <= Math.min(a,b); i++) {
        if (a%i===0 && b%i===0) n = i;
    }

    b/=n;
    while (b%2===0) b/=2;
    while (b%5===0) b/=5;

    return b === 1 ? 1 : 2;   
}

 

8-2. 

function solution(a, b) {
    return Number((a/b).toFixed(10)) == a/b ? 1 : 2
}

그래 이런걸 하고 싶었던건데..