๐ก๋ฌธ์ ๋ถ์ ์์ฝ
- ์ฃผ์ด์ง N๊ฐ์ ์ซ์ ์ค์์ ์ค๋ณต์ ํ์ฉํ์ง ์๊ณ M๊ฐ์ ์ซ์๋ฅผ ๋ฝ๋ ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ๊ตฌํ๋ค.
- ์ค๋ณต๋ ์ซ์๊ฐ ์์ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ์์ ์ค๋ณต๋ ์กฐํฉ์ ์ ๊ฑฐํด์ผ ํ๋ค.
- ์
๋ ฅ
- ์ฒซ์งธ ์ค์ N๊ณผ M์ด ์ฃผ์ด์ง๋ฉฐ (1 โค M โค N โค 8).
- ๋์งธ ์ค์ N๊ฐ์ ์ซ์๊ฐ ์ฃผ์ด์ง๋ค (1 โค ์ซ์ โค 10000).
- ์ถ๋ ฅ
- ์ฌ์ ์์ผ๋ก ์ ๋ ฌ๋ M๊ฐ ์ซ์ ์กฐํฉ์ ์ถ๋ ฅํด์ผ ํ๋ค.
๐ก์๊ณ ๋ฆฌ์ฆ ์ค๊ณ
- ์
๋ ฅ ์ฒ๋ฆฌ: N๊ณผ M์ ์
๋ ฅ๋ฐ๊ณ , N๊ฐ์ ์ซ์๋ฅผ ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
- ์ ๋ ฌ: ์
๋ ฅ๋ ์ซ์๋ฅผ ์ ๋ ฌํ์ฌ ์ฌ์ ์์ผ๋ก ์ถ๋ ฅํ ์ ์๋๋ก ํ๋ค.
- ์ฌ๊ท ํจ์ ์ฌ์ฉ: M๊ฐ๋ฅผ ์ ํํ๊ธฐ ์ํด ์ฌ๊ท์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ๋ค.
- ๊ธฐ์ ์กฐ๊ฑด: M๊ฐ๋ฅผ ๋ชจ๋ ์ ํํ ๊ฒฝ์ฐ, ์ ํํ ์กฐํฉ์ ์ถ๋ ฅํ๋ค.
- ์ํ ๋ฐ ์ ํ: ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์ํํ๋ฉฐ, ์ค๋ณต๋ ์ซ์๋ ๊ฑด๋๋ด๋ค.
- ์ค๋ณต ์ฒ๋ฆฌ: ๊ฐ์ ์ซ์์์ ๋ฐ์ํ ์ ์๋ ์ค๋ณต ์กฐํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด์ ์ ์ ํ๋ ์ซ์์ ๋น๊ตํ๋ค.
- ์ถ๋ ฅ: ์ค๋ณต์ ์ ๊ฑฐํ ์กฐํฉ์ ์ถ๋ ฅํ๋ค.
๐ก์ฝ๋
const fs = require('fs');
const path = require('path');
const input = fs.readFileSync(path.join(__dirname, 'input.txt')).toString().trim().split('\\n');
const [N, M] = input[0].split(' ').map(Number);
const numbers = Array.from(new Set(input[1].split(' ').map(Number))).sort((a, b) => a - b);
const result = [];
const visited = new Array(numbers.length).fill(false);
function backtrack(combination) {
if (combination.length === M) {
result.push(combination.join(' '));
return;
}
for (let i = 0; i < numbers.length; i++) {
if (visited[i]) continue; // ์ด๋ฏธ ์ฌ์ฉํ ์ซ์๋ ๊ฑด๋๋ด๋ค.
// ์ค๋ณต ๋ฐฉ์ง: ํ์ฌ ์ซ์๊ฐ ์ด์ ์ซ์์ ๊ฐ๊ณ , ์ด์ ์ซ์๊ฐ ์ฌ์ฉ๋ ๊ฒฝ์ฐ๋ ๊ฑด๋๋ด๋ค.
if (i > 0 && numbers[i] === numbers[i - 1] && !visited[i - 1]) continue;
visited[i] = true; // ์ฌ์ฉํ ์ซ์ ํ์
backtrack([...combination, numbers[i]]);
visited[i] = false; // ์ฌ์ฉํ ์ซ์ ๋ณต๊ตฌ
}
}
backtrack([]);
console.log(result.join('\\n'));
๐ก์๊ฐ๋ณต์ก๋
- ์ ๋ ฌ: O(N log N)
(N๊ฐ์ ์ซ์๋ฅผ ์ ๋ ฌํ๋ ๋ฐ ํ์ํ ์๊ฐ)
- ์กฐํฉ ์์ฑ: O(N^M)
(์ต์
์ ๊ฒฝ์ฐ ๋ชจ๋ ์กฐํฉ์ ์์ฑํ ์ ์๊ณ , M์ด ์์ผ๋ฏ๋ก N์ด ํฌ๋๋ผ๋ ์ํ ๊ฐ๋ฅํ๋ค.)