문제 번호 : 15652 번
문제 바로가기 ☞ https://www.acmicpc.net/problem/15652
<<< 문제 내용 >>>
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const comb = (count, originArr, inArr) => {
if (count === 0) {
combArr.push(...[inArr.join(" ")]);
return;
}
for (let i = 0; i < originArr.length; i++) {
let temp = [];
temp = originArr.slice(i);
inArr.push(originArr[i]);
comb(count - 1, temp, inArr);
inArr.pop();
}
};
let [arrLen, M] = input[0].split(" ").map(Number);
let origin = [];
for (let i = 0; i < arrLen; i++) {
origin.push(i + 1);
}
let combArr = [];
comb(M, origin, []);
console.log(combArr.join("\n"));
* 최근 프로그래머스 문제를 위주로 풀다가 다시 백준에서 문제를 풀어봤다.
이유는 재귀를 자꾸 어려워했고, 백트래킹 및 조합 관련한 문제에서 자꾸 바로바로 코딩이 안되었기 때문이다.
연습겸 노트에 쓰면서 공부하니 좀 쉽게 정리되었다.
이 문제는 백트래킹 문제이고, 원하는 갯수(M)에 도달하면 더 이상 탐색을 하지 않도록 종료하는게 핵심이다.
그리고, 재귀가 헷갈리는 사람들은 originArr 와 재귀에 들어가는 temp에 slice로 값을 넣는데 집중하는 것이
도움이 된다.
어떻게 넣냐에 따라 천차만별의 값이 나오기 때문에, 노트에 써가면서 한번 정리를 해두면
다음에는 생각만으로도 떠오르는 것 같다.
도움이 되셨다면 공감 부탁드립니다.