728x90
반응형
유한소수 판별하기
문제설명 :
소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.
- 기약분수로 나타내었을 때, 분모의 소인수가 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 |
첫번째 접근
: 먼저 분모(a)와 분자(b) 중 작은 수를 찾아 해당 숫자까지 for문을 돌려 분모와 분자에 약분을 해주었다. 이후 b에 2나 5를 나눠 나머지가 0이면 1을, 아니면 2를 return 해주었다.
틀렸다.
function solution(a, b) {
let min = Math.min(a, b)
for(let i = min; i > 1; i--){
if(a%i === 0 && b%i === 0){
a = a/i
b = b/i
}
}
return b%2 === 0 || b%5 === 0? 1 : 2
}
두번째 접근
: 음.. 왜 틀렸을까... 문제는 b가 여전히 2와 5로 나눠질 수 있다는 것이다. 예를 들어 'a/b = 2/70'인 경우, for문으로 기약분수를 만들면 1/35가 된다. 이를 첫번째 접근에서 return 문에 적용한다면 5로 나눴을때 나머지가 0이지만 35는 는 소인수로 2나 5를 가지지 않는다. 그래서 최종통과가 되지 않는다.
해당 부분을 해결하기 위해 while문을 이용해 b를 2와 5로 나눠지지 않을때 까지 나눈 후 b가 1이면 1, 아니면 2를 반환하게 한다. 해결했다.
function solution(a, b) {
let min = Math.min(a, b)
for(let i = min; i > 1; i--){
if(a%i === 0 && b%i === 0){
a = a/i
b = b/i
}
}
while (b%2 === 0) b/=2
while (b%5 === 0) b/=5
return b === 1 ? 1 : 2
}
728x90
반응형
'자료구조 및 알고리즘 > JavaScript Practice' 카테고리의 다른 글
JS Practice) 프로그래머스 : OX퀴즈 (0) | 2023.04.26 |
---|---|
JS Practice) 프로그래머스 : 최빈값 구하기 (0) | 2023.04.25 |
JS Practice) 프로그래머스 : 다항식 더하기 (0) | 2023.04.17 |
JS Practice) 프로그래머스 : 등수 매기기 (1) | 2023.04.14 |
JS Practice) 프로그래머스 : 문자열 밀기 (0) | 2023.04.13 |