본문 바로가기

BOJ/Node.js

[BOJ / Node.js] 15663. N과 M(9)

728x90

https://www.acmicpc.net/problem/15663

 

15663번: N과 M (9)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

문제

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • N개의 자연수 중에서 M개를 고른 수열

입력

첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.

출력

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

수열은 사전 순으로 증가하는 순서로 출력해야 한다.

예제 입력 1

3 1
4 4 2

예제 출력 1

2
4
 

 

 

Solve

  • 주어진 배열 내에서 중복을 체크해줘야하기 때문에 숫자의 갯수를 저장할 count라는 객체를 만들어 초기화시켜 주었습니다.
  • 백트래킹을 위한 함수(solution)를 작성해주고, 모든 경로를 탐색하며, 길이가 m일 때  return을 해주도록 조건을 작성해 놓았습니다.
  • solution함수에 argument로 count 객체를 넘겨주면서, 중복체크가 가능하도록 하였습니다.
  • 모두 탐색후에 중복된 값을을 제거해주기 위하여, removeDuplication 함수를 만들어, 적용해 주었습니다.

Problem

  • 사전순으로 정답을 출력해야하기 때문에, solution 함수를 돌리기 이전에, 기존에 주어진 배열을 먼저 sort를 해주지 않아서 오답이 나왔었습니다.

 

Code

const [input1, input2] = require("fs")
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .split("\n")
  .map((el) => el.trim());

const [n, m] = input1.split(" ").map((el) => +el);
const values = input2.split(" ").map((el) => +el);
values.sort((a, b) => a - b);

const count = {};
const countInit = () => {
  for (let i = 0; i < n; i++) {
    count[values[i]] = 0;
  }
  for (let i = 0; i < n; i++) {
    count[values[i]]++;
  }
};

const answer = [];

const solution = (v, arr, count) => {
  if (arr.length === m) {
    answer.push(arr);
    return;
  }

  count[values[v]] -= 1;

  for (let i = 0; i < n; i++) {
    if (count[values[i]] > 0) solution(i, [...arr, values[i]], { ...count });
  }
};

for (let i = 0; i < n; i++) {
  countInit();
  solution(i, [values[i]], count);
}

const removeDuplication = (arr) => {
  return [...new Set(arr.join("|").split("|"))]
    .map((v) => v.split(","))
    .map((v) => v.map((el) => +el));
};
const arr = removeDuplication(answer);
console.log(arr.map((el) => [...el].join(" ")).join("\n"));

'BOJ > Node.js' 카테고리의 다른 글

[BOJ / Node.js] 2559. 수열  (0) 2023.02.18
[BOJ / Node.js] 1920. 수 찾기  (0) 2023.02.17
[BOJ / Node.js] 21921. 블로그  (0) 2023.02.16
[BOJ / Node.js] 17070. 파이프 옮기기1  (0) 2023.02.09
[BOJ / Node.js] 15666. N과 M(12)  (0) 2023.02.08