나의 풀이
function solution(n, k) {
const number = n;
const antilogarithm = k;
const changeAntilogarithm = number.toString(antilogarithm);
let numbersWithoutZero = '';
const result = [...changeAntilogarithm].reduce((acc, cur, index, arr) => {
if (cur !== '0') numbersWithoutZero += cur;
if (cur === '0' || index === arr.length - 1) {
if (isPrime(Number(numbersWithoutZero))) acc.push(numbersWithoutZero);
numbersWithoutZero = '';
}
return acc;
}, []).length;
return result;
}
function isPrime(num) {
if (!num || num === 1) return false;
for (let i = 2; i <= Math.sqrt(num); i++) {
if (!(num % i)) return false;
}
return true;
}
1. k 진수로 변환한다.
2. 변환된 숫자를 하나씩 구분하여 배열로 만든뒤 reduce를 통해서 하나씩 확인한다.
1) 만약 0이 아니면 numbersWithoutZero에 추가해준다.
2) 만약 0이거나 마지막 index 일때 numbersWithoutZero가 소수이면 누산기에 push를 해주고 아니면 초기화만 한다.
3) acc에는 남는 값은 아래와 같다
- 소수 양쪽에 0이 있는 경우
- 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우
- 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우
- 소수 양쪽에 아무것도 없는 경우
4) reduce한 배열의 length를 return 하면 그게 답이 된다.
기존 코드 리팩터링
function solution(n, k) {
const numbers = n;
const antilogarithm = k;
const NumbersChangedAntilogarithm = numbers.toString(antilogarithm);
const result = selectPrimeNotIncludeZero(NumbersChangedAntilogarithm);
return result.length;
}
function selectPrimeNotIncludeZero(numbers, numbersWithoutZero = '') {
return [...numbers].reduce((acc, cur, index, arr) => {
if (cur !== '0') numbersWithoutZero += cur;
if (cur === '0' || index === arr.length - 1) {
if (isPrime(Number(numbersWithoutZero))) acc.push(numbersWithoutZero);
numbersWithoutZero = '';
}
return acc;
}, []);
}
function isPrime(num) {
if (!num || num === 1) return false;
for (let i = 2; i <= Math.sqrt(num); i++) {
if (!(num % i)) return false;
}
return true;
}
다른 사람 풀이
function isPrime(num){
if(!num || num===1) return false;
for(let i=2; i<=+Math.sqrt(num); i++){
if(num%i===0) return false;
}
return true;
}
function solution(n, k) {
// k진법으로 나눈 후 split
const candidates = n.toString(k).split('0');
// 소수 개수 세기
return candidates.filter(v=>isPrime(+v)).length;
}
아 맞다 split !!!!!!!!!
하 굳이 reduce를 사용할 필요가 없었구나...
split를 사용하면 정말 쉽게 분류가 되는데 왜 생각을 못 했을까?
훨신 코드가 쉽고 가독성이 좋다.
다음에는 구분하는 과정이 있으면 꼭 split먼저 떠올려보자.
'알고리즘 > 프로그래머스 - JS' 카테고리의 다른 글
[프로그래머스 - JS] level.2 귤 고르기 (0) | 2022.12.31 |
---|---|
[프로그래머스] level.2 압축 (0) | 2022.12.27 |
[프로그래머스 - JS] level.2 프린터 (0) | 2022.12.23 |
[프로그래머스 - JS ] level.2 [1차] 뉴스 클러스터링 (ing) (0) | 2022.11.02 |
[프로그래머스] level.2 위장 (해시) (0) | 2022.10.25 |