[Algorithm] Prime Jack (조합)

Yalstrax·2021년 7월 25일
1

Algorithm

목록 보기
3/17
post-thumbnail

primeJack (조합)

문제

새로운 카드 놀이를 만들었습니다. 룰은 다음과 같습니다.

  1. 숫자로 이루어진 카드를 여러 장 받습니다.
  2. 3장씩 카드를 고르고, 3장에 적힌 숫자들의 합이 소수인지 확인합니다.
  3. 받아든 카드로 만들 수 있는 소수의 개수가 많은 사람이 이기게 됩니다.

예로, [1, 2, 3, 4]라는 카드를 받았을 때 만들 수 있는 숫자는 6, 7, 8, 9이고, 소수는 7 하나이기 때문에 가지고 있는 소수의 개수는 1개입니다.

[2, 3, 4, 8, 13]라는 카드를 받았을 때 만들 수 있는 숫자는 9, 13, 18, 14, 19, 23, 15, 20, 24, 25이고, 소수는 13, 19, 23 총 3개이기 때문에 가지고 있는 소수의 개수는 3개입니다.

입력

인자 1

  • cards: Array 3개 이상 50개 이하의 카드가 숫자로 들어 있는 배열

출력

  • Number 타입을 리턴해야 합니다.

주의사항

  • cards 에는 중복된 숫자의 카드는 들어있지 않습니다.
  • 각 카드에 적힌 수는 1이상 1,000이하의 자연수입니다.

입출력 예시

나의 코드

이 카드 게임은 조합 개념이 적용됩니다.
여러 장의 카드 중, 순서를 고려하지 않고 3장을 뽑습니다.

결과

소스코드

function primeJack(cards) {
  let count = 0;
  // 3중 반복문을 수행합니다.
  for (let i = 0; i < cards.length; i++) {
    for (let j = i + 1; j < cards.length; j++) {
      for (let k = j + 1; k < cards.length; k++) {
        // 세 가지 카드의 숫자를 더하여 소수를 판별합니다.
        // 소수라면, 경우의 수를 1 증가시킵니다.
        if (isPrime(cards[i] + cards[j] + cards[k])) count++;
      }
    }
  }
  return count;
}

// 인자로 들어온 숫자가 소수인지 판별하는 함수입니다.
// 시간 복잡도를 고려하여 숫자의 제곱근 값 까지만 반복 순회합니다.
const isPrime = function (num) {
  if (num === 2) return true;
  if (num % 2 === 0) return false;
  for (let i = 3; i <= Math.floor(Math.sqrt(num)); i += 2) {
    if (num % i === 0) return false;
  }
  return true;
};

console.log(primeJack([10, 11, 1, 5, 18]));
profile
즐겁다면 그것만으로 만만세!

0개의 댓글