์žฌ๊ท€์™€ ๋ฐ˜๋ณต์ด ๊ฐ™์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ

8/3/2025

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 ๋ฐ˜๋ณต๋ฌธ์„ ์“ฐ๋Š”๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค.