알고리즘 풀이

[백준 6630, NodeJS] 로또

FE코크 2021. 1. 22. 21:28

www.acmicpc.net/problem/6603

 

6603번: 로또

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로

www.acmicpc.net

백준 6603 로또 문제 풀이입니다

재귀, 백트래킹, 순열로 풀었습니다.

문제
독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다.
로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는 것이다.
예를 들어, k=8, S={1,2,3,5,8,13,21,34}인 경우 이 집합 S에서 수를 고를 수 있는 경우의 수는 총 28가지이다. ([1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2,3,5,13,21], ..., [3,5,8,13,21,34])
집합 S와 k가 주어졌을 때, 수를 고르는 모든 방법을 구하는 프로그램을 작성하시오.

 

풀이

const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const len = input.length;
const LOTTO_COUNT = 6;

const getLottoCase = (input) => {
  const maxCount = input[0];
  const sets = input.slice(1);
  let result = "";

  const permute = (arr, m = [], i = 0) => {
    if (m.length === LOTTO_COUNT) {
      result += `${m.join(" ")}\n`;
    } else {
      for (i; i < arr.length; i++) {
        let current = arr.slice();
        let next = current.splice(i, 1);
        permute(current.slice(), m.concat(next), i);
      }
    }
  };

  permute(sets);
  return result;
};

for (let i = 0; i < len - 1; i++) {
  console.log(getLottoCase(input[i].split(" ").map((n) => Number(n))));
}