N과 M(2)
문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
- 고른 수열은 오름차순이어야 한다.
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
출력
- 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다.
- 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
- 수열은 사전 순으로 증가하는 순서로 출력해야 한다.
예제 입력 1
3 1
예제 출력 1
1 2 3
예제 입력 2
4 2
예제 출력 2
1 2 1 3 1 4 2 3 2 4 3 4
예제 입력 3
4 4
예제 출력 3
1 2 3 4
출처
- 문제를 만든 사람: baekjoon
function b15650() {
var fs = require('fs');
var input = fs.readFileSync('/dev/stdin').toString().split(' ');
// var input = fs.readFileSync(__dirname + '/stdin.txt').toString().replace(/\r/g, "").split(' ');
var n = parseInt(input[0])
var m = parseInt(input[1])
var temp = new Array(n).fill(0)
for (var i = 1; i <= n; i++) {
temp[i - 1] = i
}
var ans = []
for (var c = 0; c < temp.length; c++) {
combination(ans, c, temp, temp[c].toString(), m)
}
print(ans)
}
function combination(ans, currentIndex, temp, str, m) {
var newArr = temp.slice(currentIndex+1, temp.length)
var array = str.split(' ')
if(array.length == m){
ans.push(str)
return
}
for(var i=0; i<newArr.length; i++){
combination(ans, i, newArr, str+" "+newArr[i].toString(), m)
}
}
function print(ans){
for(var i=0; i<ans.length; i++){
console.log(ans[i])
}
}
b15650()
중복되는 수열을 여러 번 출력하면 안된다.
- 조합 함수 내에 필요한 변수는?
👉🏻 조합을 시작할 원소의 인덱스(currentIndex
), temp, 조합의 결과(str
), 조합의 결과를 저장할 배열(ans
), m- 조합 함수 내에서 temp를 현재 원소 다음부터 temp끝까지로 자른다.
var newArr = temp.slice(currentIndex+1, temp.length)
- N과 M(1) 문제에서처럼
str
에 붙은 숫자의 갯수가m
과 같으면ans
에 저장한다.ans
에 저장된 조합 결과값들을 출력한다.