๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[Javascript] ์†Œ์ˆ˜ ์ฐพ๊ธฐ (42839)

๋ฌธ์ œ๋งํฌ

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์†Œ์ˆ˜ ์ฐพ๊ธฐ

ํ•œ์ž๋ฆฌ ์ˆซ์ž๊ฐ€ ์ ํžŒ ์ข…์ด ์กฐ๊ฐ์ด ํฉ์–ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค. ํฉ์–ด์ง„ ์ข…์ด ์กฐ๊ฐ์„ ๋ถ™์—ฌ ์†Œ์ˆ˜๋ฅผ ๋ช‡ ๊ฐœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ข…์ด ์กฐ๊ฐ์— ์ ํžŒ ์ˆซ์ž๊ฐ€ ์ ํžŒ ๋ฌธ์ž์—ด numbers๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ข…์ด

programmers.co.kr

 

 

์ ‘๊ทผ ๋ฐฉ๋ฒ•

์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ ๊ธธ์ด๊ฐ€ n์ผ๋•Œ nP1, nP2, ~~ nPn๊นŒ์ง€ ๊ตฌํ•œ ๋’ค 
๊ตฌํ•œ ๋ฐฐ์—ด ์ค‘ ์†Œ์ˆ˜์ธ ์ˆซ์ž๋ฅผ ์ฐพ๋Š” ์™„์ „ ํƒ์ƒ‰ ๋ฌธ์ œ์ด๋‹ค.

๋ฐฐ์šด ๋ถ€๋ถ„

for (let selectNumber = 1; selectNumber <= numbers.length; selectNumber++) {
    permutationArr.push(
      ...getPermutations(numbers, selectNumber)
        .map((e) => e.join(''))
        .map((e) => parseInt(e))
    );
  }โ€‹

 

2์ฐจ์› ๋ฐฐ์—ด์„ push ๋ฐ›๋Š” ๋ถ€๋ถ„์„ spread ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๊ณ ,
map์„ ํ†ตํ•ด joinํ•œ ๋’ค, ์ •์ˆ˜๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

function solution(numbers) {
  var answer = 0;
  numbers = numbers.split('');
  const permutationArr = [];

  for (let selectNumber = 1; selectNumber <= numbers.length; selectNumber++) {
    permutationArr.push(
      ...getPermutations(numbers, selectNumber)
        .map((e) => e.join(''))
        .map((e) => parseInt(e))
    );
  }

  const permutationSet = [...new Set(permutationArr)].map((e) => parseInt(e));

  permutationSet.forEach((e) => {
    if (isPrime(e)) answer += 1;
  });

  return answer;
}

const getPermutations = function (arr, selectNumber) {
  const results = [];
  if (selectNumber === 1) return arr.map((value) => [value]);

  arr.forEach((fixed, index, origin) => {
    const rest = [...origin.slice(0, index), ...origin.slice(index + 1)];
    const permutations = getPermutations(rest, selectNumber - 1);
    const attached = permutations.map((permutation) => [fixed, ...permutation]);
    results.push(...attached);
  });

  return results;
};

const isPrime = (num) => {
  for (let i = 2; i <= Math.sqrt(num); i++) {
    if (num % i === 0) return false;
  }
  return num >= 2;
};