CodeWars 코딩 문제 2021/01/14 - Backwards Read Primes

이호현·2021년 1월 14일
0

Algorithm

목록 보기
49/138

[문제]

Backwards Read Primes are primes that when read backwards in base 10 (from right to left) are a different prime. (This rules out primes which are palindromes.)

Examples:
13 17 31 37 71 73 are Backwards Read Primes

13 is such because it's prime and read from right to left writes 31 which is prime too. Same for the others.

Task
Find all Backwards Read Primes between two positive given numbers (both inclusive), the second one always being greater than or equal to the first one. The resulting array or the resulting string will be ordered following the natural order of the prime numbers.

Example
backwardsPrime(2, 100) => [13, 17, 31, 37, 71, 73, 79, 97] backwardsPrime(9900, 10000) => [9923, 9931, 9941, 9967] backwardsPrime(501, 599) => []

Note for Forth
Return only the first backwards-read prime between start and end or 0 if you don't find any

backwardsPrime(2, 100) => [13, 17, 31, 37, 71, 73, 79, 97]
backwardsPrime(9900, 10000) => [9923, 9931, 9941, 9967]

(요약) startstop사이의 숫자 중에서 소수이면서 뒤집었을 때도 소수인 것들만 구해라.

[풀이]

function backwardsPrime(start, stop){
  const answer = [];

  for(let i = start < 10 ? 10 : start; i <= stop; i++) {
    let prime = true;

    for(let j = 2; j <= Math.sqrt(i); j++) {
      if(!(i % j)) {
        prime = false;
        break;
      }
    }  

    if(prime) {
      const reverse = `${i}`.split('').reverse().join('') * 1;

      if(i === reverse) continue;

      let reversePrime = true;

      for(let i = 2; i <= Math.sqrt(reverse); i++) {
        if(!(reverse % i)) {
          reversePrime = false;
          break;
        }
      }

      if(reversePrime) {
        answer.includes(i) ? null : answer.push(i);
        answer.includes(reverse) ? null : answer.push(reverse);
      }
    }
  }

  return answer.filter(num => num >= start && num <= stop).sort((a, b) => a - b);
}

우선 startstop 사이의 숫자들 중에서 소수인 것들을 먼저 찾는다.
단, 한자리 숫자는 뒤집을 수가 없으니 제외.
숫자를 뒤집기 위해서 문자열로 바꾸고, split()으로 쪼개고, reverse()로 뒤집고, join()으로 붙이고, * 1로 숫자화 한 후에 그 숫자가 소수인지 판별.
뒤집기 전이랑 후가 둘 다 소수이면 배열에 push.
배열에 이미 있으면 push를 하지 않음.
혹시 모르니 마지막에 다시 한번 filter로 범위안의 숫자만 구하고, 오름차순 정렬해서 return.

// 변경 전
if(reversePrime) {
  answer.includes(i) ? null : answer.push(i);
  answer.includes(reverse) ? null : answer.push(reverse);
}

// 변경 후
if(reversePrime) {
  answer.includes(i) || answer.push(i);
  answer.includes(reverse) || answer.push(reverse);
}

answer.includes()false일 때만 실행이 돼야하기 때문에 ||를 사용하게 코드 리팩토링 살짝 함.

profile
평생 개발자로 살고싶습니다

0개의 댓글