문제 설명
소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.
기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.
두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.
제한사항
입출력 예
a | b | result |
---|---|---|
7 | 20 | 1 |
11 | 22 | 1 |
12 | 21 | 2 |
입출력 예 설명
분수 7/20은 기약분수 입니다. 분모 20의 소인수가 2, 5 이기 때문에 유한소수입니다. 따라서 1을 return합니다.
분수 11/22는 기약분수로 나타내면 1/2 입니다. 분모 2는 소인수가 2 뿐이기 때문에 유한소수 입니다. 따라서 1을 return합니다.
분수 12/21는 기약분수로 나타내면 4/7 입니다. 분모 7은 소인수가 7 이므로 무한소수입니다. 따라서 2를 return합니다.
Hint
const solution = (a, b) => {
// 기약분수 만들기
let n = 2;
while (a > n || b > n) {
if (a%n !== 0 || b%n !== 0) {
n++;
} else {
a = a / n;
b = b / n;
}
};
// 분모의 약수 구하기
let divisor = [];
for (let i = 1; i <= b; i++) {
if (b%i === 0) {
divisor.push(i);
} else continue;
};
// 1은 소수가 아니기 때문에 제외
let divi = []
if(divisor.includes(1)) {
divi = divisor.slice(1)
} else divi = divisor;
// 분모 약수 중 소인수 구하기
let primeFactor = [];
for (let k = 0; k < divi.length; k++) {
let count = 0;
let indxNum = divi[k];
let num = 2;
while (num <= divi[k]) {
if (indxNum%num === 0) {
if (indxNum/num === 1) {
count++
break;
} else {
count++;
num++;
}
} else {
num++
}} if (count < 2) {
primeFactor.push(divi[k])
}};
// 원소가 2 또는 5인 값으로 이루어져 있는지 참거짓 판별
let answer = [];
answer = primeFactor.map(el => el === 2 || el === 5)
// 거짓이 하나라도 있으면 2출력
// 모두 다 참이면 1출력
if (answer.includes(false)) {
return 2
} else return 1;
};
a | b | result |
---|---|---|
1 | 6 | 2 |