본문 바로가기
Algorithms/코테 문풀

[프로그래머스] 유한소수 판별하기 - JavaScript / toFixed() 메서드

by hi-rachel 2023. 1. 11.

✏️ 문제 설명

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

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

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


제한사항
  • a, b는 정수
  • 0 < a ≤ 1,000
  • 0 < b ≤ 1,000

 

입출력 예
a b result
7 20 1
11 22 1
12 21 2

입출력 예 설명

입출력 예 #1

  • 분수 7/20은 기약분수 입니다. 분모 20의 소인수가 2, 5 이기 때문에 유한소수입니다. 따라서 1을 return합니다.

입출력 예 #2

  • 분수 11/22는 기약분수로 나타내면 1/2 입니다. 분모 2는 소인수가 2 뿐이기 때문에 유한소수 입니다. 따라서 1을 return합니다.

입출력 예 #3

  • 분수 12/21는 기약분수로 나타내면 4/7 입니다. 분모 7은 소인수가 7 이므로 무한소수입니다. 따라서 2를 return합니다.

Hint
  • 분자와 분모의 최대공약수로 약분하면 기약분수를 만들 수 있습니다.
  • 정수도 유한소수로 분류합니다.

 

 


 

✏️ 문제 풀이

나는 테스트케이스 오류가 너무 많이 나서 못풀었다ㅜ 다른 사람 풀이를 참고해보자.

function solution(a, b) {
    let g = 1;

    for (let i = 1; i <= b; i++) {
        if (a % i === 0 && b % i == 0) g = i;
    }
    b = b/g

    while (b % 2 === 0) b = b/2
    while (b % 5 === 0) b = b/5
    
    return b === 1 ? 1 : 2;
}

Hint대로 최대공약수(g)를 구해서 나눠 기약분수로 바꿔주고 2, 5로 나눠준 이후에도 1이 아니라면 (2, 5 말고도 다른 소인수를 가지고 있다면) 2를 반환한다. 아니면 1 반환.

나도 이런 식으로 접근했지만 최대 공약수를 안구하고 바로 나눠주며 테스트 케이스를 통과하지 못했다.

 

  •  제일 간단한 풀이
function solution(a, b) {
    return Number((a/b).toFixed(10)) == a/b ? 1 : 2
}

문제 설명을 보면 '소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수'인데 유한소수를 찾는 문제니 소수점이 계속되냐를 놓고 풀은 방식. 10자리가 넘어가는 유한소수가 있다면 통과하지 못하니 완벽한 풀이는 아니다.

여기서 정의를 하고 가자면

💎 유한 소수 : 소수점 아래에 0이 아닌 숫자가 유한개인 소수 == 분자, 분모를 약분한 기약분수에서 분모를 소인수분해했을 때 분모의 소인수가 2나 5뿐임

💎 무한 소수 : 소수점 아래에 0이 아닌 숫자가 무한히 계속되는 소수 == 기약분수에서 분모의 소인수가 2나 5 외에 다른 수가 있음

 

▶ Number.prototype.toFixed()

toFixed() 메서드는 고정 소수점 표기법(fixed-point notation)을 사용하여 숫자 형식을 지정한다.

function financial(x) {
  return Number.parseFloat(x).toFixed(2);
}

console.log(financial(123.456));
// expected output: "123.46"

console.log(financial(0.004));
// expected output: "0.00"

console.log(financial('1.23e+5'));
// expected output: "123000.00"

 

// Syntax
toFixed()
toFixed(digits)

// digits(선택): 소수점 뒤에 표시할 자릿수. 0과 100 사이의 값이어야 한다. 쓰지 않으면 0으로 처리
// 반환 값 : 고정 소수점 표기법을 사용하여 주어진 숫자를 나타내는 문자열

 

참고 사이트

유한소수와 무한소수

풀이 참고

프로그래머스, MDN

 

 

😎 공부하면서 정리한 글입니다. 잘못된 점이 있다면 피드백 부탁드립니다.