[조합] 블랙잭은 지겨워

박재현·2022년 3월 23일
0

문제

평범한 블랙잭 게임에서 수시로 패배하자 흥미가 떨어진 김코딩은 박타짜에게 게임룰을 변형하여 새로운 카드 놀이를 해 볼 것을 제안합니다.
새로운 룰은 다음과 같습니다.

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이하의 자연수입니다.

입출력 예시

let output = boringBlackjack([1, 2, 3, 4]);
console.log(output); // 1

let output = boringBlackjack([2, 3, 4, 8, 13]);
console.log(output); // 3

📌 해당 문제는 조합과 관련된 문제로 순서를 고려해 만들 수 있는 숫자 합을 구한 후 이게 소수인지 판단해 그 갯수를 리턴하면 된다.

  1. 만들어질 숫자 조합의 갯수만큼 tmp 배열을 만든다.
  2. 3개를 뽑는 다고 정해져 있으므로 탐색 종료 조건으로 L이 3이 되었을 때 만들어진 숫자를 더해 anser 배열에 넣는다.
  3. 그렇지 않은 경우 card 길이 만큼 DFS를 실행한다.
  4. 다음 DFS를 뻗을 때 이전에 포함되었던 숫자는 제외해야 하기 때문에 for문의 초기조건 i(시작 숫자)에 1을 더해서 넘겨준다.
  5. answer에 만들어진 숫자 중 소수인지 판별하는 절차를 거쳐 그 갯수를 리턴해준다.
const isPrime = (n) => {
    for (let i = 2; i <= Math.sqrt(n); i++) {
      if (n % i === 0) {
        return false;
      }
    }
    return true;
    }

function boringBlackjack(cards) {
    let answer = [];
    let tmp = Array.from({length: 3}, ()=>0);

    const DFS = (L, s) => {
      if ( L === 3) {
        answer.push([...tmp].reduce((prev, cur) => prev+cur))
      }
      else {
        for ( let i = s; i < cards.length; i++ ) {
          tmp[L] = cards[i]
          DFS(L+1, i+1)
        }
      }
    }

    DFS(0, 0)
    
    return answer.filter((num) => isPrime(num)).length
}

0개의 댓글