[๋ฐฑ์ค]9663๋ฒ 'N-Queen' ๋ฌธ์ ํ์ด - JavaScript
๋ฌธ์
N-Queen ๋ฌธ์ ๋ ํฌ๊ธฐ๊ฐ N x N์ธ ์ฒด์คํ ์์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ ๋ฌธ์ ์ด๋ค.
N์ด ์ฃผ์ด์ก์ ๋, ํธ์ ๋๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. (1 ≤ N < 15)
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
8
์์ ์ถ๋ ฅ 1
92
๐ ํ์ด ์ฝ๋
const fs = require('fs');
const file = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(file).toString().trim();
const n = Number(input);
const queens = [];
let count = 0;
function possible(x, y) {
for (const [a, b] of queens) {
if (a === x || b === y) return false;
if (Math.abs(a - x) === Math.abs(b - y)) return false;
}
return true;
}
function dfs(row) {
if (row === n) {
count++;
return;
}
for (let i = 0; i < n; i++) {
if (!possible(row, i)) continue;
queens.push([row, i]);
dfs(row + 1);
queens.pop();
}
}
dfs(0);
console.log(count);
๐ ํ์ด ํด์ค
ํธ์ ๋์ ์ ์๋ ๋ฐฉ๋ฒ์ Aํธ์ด ์กด์ฌํ๋ค๋ฉด Aํธ์ ํ๊ณผ ์ด, ๊ทธ๋ฆฌ๊ณ ๋๊ฐ์ ์์น๊ฐ ์๋ ์์น์ ๋์ ์ ์๋ค.
N๊ฐ์ ํธ์ ๋๊ธฐ ์ํด์๋ ๊ฐ ํ ๋ง๋ค 1๊ฐ์ฉ ๋์์ผ N๊ฐ์ ํธ์ ๋์ ์ ์๋ค.
N = 4๋ผ๊ณ ๊ฐ์ ์ ํด๋ณด์.
Q | |||
Q | |||
Q | |||
Q |
์ด๋ฐ ์์ผ๋ก ๊ฐ ํ์ ํ๋์ฉ Q์ด ๋ค์ด๊ฐ์ผ N x N์ N๊ฐ์ ํธ์ ๋์ ์ ์๋ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด ๋ฌธ์ ๋ ์ด๋ ๊ฒ ๋์ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ค.
๋งค ์ฌ๊ทํจ์๋ง๋ค N x N์ ๋ชจ๋ ์์น๋ฅผ ๋ณผ ํ์๋ ์๋ค.
๋งจ ์ฒ์ ํ(row)๋ถํฐ ์ฐจ๋ก๋๋ก ํธ์ ๋๋๋ค๊ณ ์๊ฐํ๋ฉด ํ์ํด์ผ ํ๋ ๋ฒ์๋ฅผ ์ค์ผ ์ ์๋ค.
์ด ๋ฌธ์ ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ๊ณ์ฐํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํ์ฌ ํ์ ์ด์ ํ์ผ๋ก ๋์๊ฐ ํ์๊ฐ ์๋ค.
์ฆ, ์ด ๋ฌธ์ ๋ ๋ฐฑํธ๋ํน์ผ๋ก ํ ์ ์๋ค.
ํน์ ์์น(๋ ธ๋)๋ก ๊ฐ ์ ์๋์ง๋ฅผ ํ๋ณํ๋ฉด ๋๋๋ฐ, ์ด๋ ํธ์ ๋์ ์ ์๋ ์์น์ธ๊ฐ ์๋๊ฐ๋ฅผ ํ๋ณํด์ผ ํ๋ค.
ํ์ฌ ๋์ผ๋ ค๋ ํธ์ด ๊ธฐ์กด์ ์๋ ํธ์ ์์น์ ๋น๊ตํ๋ฉฐ
- ๊ฐ์ ํ์ ์๋์ง ํ์ธ: (x1 == x2) || (y1 == y2)
- ๋๊ฐ์ ์ ์๋์ง ํ์ธ: abs(x1 - x2) == abs(y1 - y2)
๋๊ฐ์ ์ ์๋์ง ํ์ธํ๋ ๋ถ๋ถ์์ ์ด๋ฐ ๊ณ์ฐ ๋ฐฉ๋ฒ์ด ๋์จ ์ด์ ๋ ์๋์ ๊ฐ๋ค.
Q | |||
Q | |||
Aํธ : 0๋ฒ์งธ ํ, 2๋ฒ์งธ ์ด์ ํธ์ด ๋์ฌ ์๋ค. (0, 2)
Bํธ: 1๋ฒ์งธ ํ, 1๋ฒ์งธ ์ด์ ํธ์ ๋์ผ๋ ค๊ณ ํ๋ค. (1, 1)
abs(0 - 1) = 1
==
abs(2 - 1) = 1
๋์ธ ํธ๊ณผ ๋์ผ๋ ค๋ ํธ์ ํ๋ผ๋ฆฌ ์ฐจ์ด์ ์ด ๋ผ๋ฆฌ ์ฐจ์ด์ ๊ฐ์ด ๊ฐ๋ค๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
์, ๊ทธ๋ผ ์ด์ ๊ตฌํํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์ ์ถ๋ ฅ์ n๋ณ์์ ๋ด์์ฃผ๊ณ , ํ์ฌ๊น์ง ๋์ธ ํธ๋ค์ ์์น๋ฅผ ์ ์ฅํ queen ๋ฐฐ์ด์ ๋น ๋ฐฐ์ด๋ก ์ด๊ธฐํํด์ค๋ค.
๊ฒฝ์ฐ์ ์๋ฅผ ๋ด์ count ๋ณ์๋ ์ ์ธํด ์ค๋ค.
possibe ํจ์๋ ๋์ผ๋ ค๋ ํธ์ ํ๊ณผ ์ด์ x, y๋ก ๋ฐ๋๋ค.
์ง๊ธ๊ป ๋์ธ ํธ์ ์์น๋ฅผ ๋ด์ queens ๋ฐฐ์ด์ ์ํํ๋ฉด์ ์์์ ๋งํ ๋์ ์ ์๋ ์์น์ธ์ง ์๋์ง๋ฅผ ํ๋ณํ๋ฉฐ ๋์ ์ ์๋ค๋ฉด false, ๋์ ์ ์๋ค๋ฉด ture๋ฅผ ๋ฐํํด ์ค๋ค.
dfsํจ์๋ ๋ง์ง๋ง ํ๊น์ง ๊ฐ๋ค๋ฉด N๊ฐ์ ํธ์ ๋์๋ค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ count๋ฅผ ์ฆ๊ฐ์์ผ ์ค๋ค.
๋ง์ง๋ง ํ๊น์ง ๊ฐ์ง ์์๋ค๋ฉด 0๋ถํฐ n๊น์ง ๋ฐ๋ณต๋ฌธ์ ์ํํ๋ค.
๋์ผ๋ ค๋ ํธ์ ํ(row)๊ณผ ์ด(i)๋ฅผ possible ํจ์๋ก ๋๊ฒจ์ฃผ๊ณ boolean๊ฐ์ ๋ฐ๋๋ค.
๋์ ์ ์๋ค๋ฉด ๋ค์ ์ด๋ก ์ด๋(continue)์์ผ์ฃผ๊ณ ๋์ ์ ์๋ค๋ฉด queens ๋ฐฐ์ด์ ๋์ ์์น๋ฅผ ๋ด์์ฃผ๊ณ ์ฌ๊ทํจ์๋ฅผ ํธ์ถํ๋ฉฐ ๋ค์ ํ(row)์ผ๋ก ๋์ด๊ฐ๋ค (row + 1)
์ฌ๊ท ํจ์๊ฐ ๋๋๋ฉด queens๋ฐฐ์ด์ ๋์๋ ํธ์ ์์น๋ฅผ ๋นผ์ค๋ค.
์ด๋ ๊ฒ ๊ฐ์ง์๋ฅผ ์ณ๊ฐ๋ฉด์ ํ๋ํ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฐพ์์ ๋ง์ง๋ง์ count๋ฅผ ์ถ๋ ฅํ๋ค.