코딩 테스트
[프로그래머스 Level 0] 유한소수 판별하기
y_flm
2025. 4. 5. 21:21
문제:
소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다.
분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다.
유한소수가 되기 위한 분수의 조건은 다음과 같습니다.
- 기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.
두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.
문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/120878
풀이보기
더보기
function solution(a, b) {
let min = Math.min(a, b);
let numerator = a;
let denominator = b;
for(let i = 2; i <= min; i++) {
if(numerator % i === 0 && denominator % i === 0) {
numerator = Math.floor(numerator / i);
denominator = Math.floor(denominator / i);
}
}
while(denominator !== 1) {
if(denominator % 2 === 0) {
denominator = Math.floor(denominator / 2);
} else if(denominator % 5 === 0) {
denominator = Math.floor(denominator / 5);
} else {
return 2;
}
}
return 1;
}
먼저 기약분수로 변환하기 위해 두 수 중 더 작은 수를 찾아 min 변수에 넣어주고,
for문에서는 2부터 min까지의 수를 통해 각각 나눠지는 숫자일 때 분자와 분모를 나눠준다.
그 다음 기약분수는 만들어졌으니 while문을 통해 분모의 소인수가 2, 5뿐인지 판별해준다.
조건은 분모가 1이되면 멈추도록 해주고 분모를 각각 2와 5로 나누었을 때 나머지가 0이 되는 경우에만
분모와 2 또는 5로 나눈 몫을 분모에 저장해준다.
여기서 2와 5로 나누어지지 않는다면 무한 소수이므로 2를 리턴해주고,
정상적으로 while문이 종료되면 유한소수일테니 1을 리턴해준다.