저장을 습관화
프로그래머스 LV.0 유한소수 판별하기 본문
프로그래머스 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
}
그래 이런걸 하고 싶었던건데..
'코딩 테스트 > 프로그래머스 - 자바스크립트' 카테고리의 다른 글
프로그래머스 LV.0 연속된 수의 합 (0) | 2024.02.27 |
---|---|
프로그래머스 LV.0 특이한 정렬 (0) | 2024.02.26 |
프로그래머스 LV.0 평행 (0) | 2024.02.24 |
프로그래머스 LV.0 저주의 숫자 3 (0) | 2024.02.23 |
프로그래머스 LV.0 다항식 더하기 (0) | 2024.02.20 |