push-์ฌ๊ท-pop-์ฌ๊ท vs push-์ฌ๊ท-pop
N-Queen ๋ฌธ์
function solution1(n) {
const answer = [];
function isSafe(queens,row,col) {
for(const comp of queens){
const r = comp[0];
const c = comp[1];
if(row===r||col===c|| Math.abs(row-r)===Math.abs(col-c)){ // Math.abs์์จ์ ํ๋ ธ์์
return false;
}
}
return true;
}
function solve(queens,row){
if(row===n){
answer.push([...queens]);
return;
}
for(let i=0;i<n;i++){
const flag = isSafe(queens,row,i);
if(flag){
queens.push([row,i]);
solve(queens,row+1);
queens.pop();
//solve(queens.row+1); //์ด๊ฑฐ ๋ฃ์์ผ๋ฉด ์๋์.
}
}
}
solve([],0);
console.log(answer);
return answer.length;
}
// console.log("N-Queens (4):", solution1(4));
console.log("N-Queens (8):", solution1(8));
๋ฐฑํธ๋ํน ๋ฌธ์ ๋ฅผ ํ๋ค๋ณด๋ฉด ์ธ์ ๋
์ฌ๊ทํจ์ ํ์ pop()
ํด์ ๋ฃ์๋๊ฑธ ๋บ ํ์ ๋ค์ ์ฌ๊ทํจ์๋ฅผ ๋๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์๊ณ , (push-์ฌ๊ท-pop-์ฌ๊ท)
์ด์ฉ๋๋ push-์ฌ๊ท-pop ๊น์ง๋ง ํ๋ค.
ํ์ ๋ ธ๋ ํ์
์์ด์์ฑ๊ณผ ๊ฐ์ด ํ์ ๋
ธ๋๋ค์ ๋ชจ๋ ํ์ํด์ผ ํ ๋๋ push-์ฌ๊ท-pop-์ฌ๊ท.
๋ชจ๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ฅผ ํ์ํด์ผํ ๋.
๊ทธ๋ฐ๋ฐ ๋ด๊ฐ ์์ N-Queen ๋ฌธ์ ๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ ๋ฌธ์ ์๋๊ฐ?
์์ ์ฝ๋์์๋ ์ฌ๊ทํธ์ถ ์์ for๋ฌธ์ผ๋ก ๋ฐ๋ณต์ ๋ณด์ฅํด์คฌ๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง ์ฌ๊ทํจ์ ํธ์ถ์ด ์์ด๋ ๋๋ค.
function solveRecursive(queens, row, col) {
if (row === n) {
answer.push([...queens]);
return;
}
if (col >= n) return;
if (isSafe(queens, row, col)) {
queens.push([row, col]);
solveRecursive(queens, row+1, 0);
queens.pop();
}
solveRecursive(queens, row, col+1);
}
์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ด๊ฐ ์๋ ์ดํดํ๊ณ ์๋ ์ฌ๊ทํจ์์ ํํ๊ฐ ๋๋ค.
์ฌ๊ท + ๋ฐ๋ณต์ด ํ์ํ ์ ํ
์์ด ์์ฑ
function solution4(arr) {
const result = [];
const visited = new Array(arr.length).fill(false);
// console.log(visited);
function permutation(perm) {
if (perm.length === arr.length) {
result.push([...perm]);
return;
}
for (let i = 0; i < arr.length; i++) {
// console.log(arr[i],visited[i]);
if (!visited[i]) {
perm.push(arr[i]);
visited[i] = true;
permutation(perm);
perm.pop();
visited[i] = false;
}
}
}
permutation([]);
return result;
}
์์ด์์ฑ์ ๋ฌธ์ ์์๋ ๊ฐ ์ฌ๊ท ๋จ๊ณ์์ ๋ช ๊ฐ์ ์ ํ์ง๊ฐ ์๋์ง ๋ฏธ๋ฆฌ ์ ์ ์๊ธฐ ๋๋ฌธ์ for ๋ฐ๋ณต๋ฌธ์ ์ฐ๋๊ฒ์ด๋ผ๊ณ ํ๋ค.