์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ/๋ฐฑ์ค€

[๋ฐฑ์ค€]9663๋ฒˆ 'N-Queen' ๋ฌธ์ œ ํ’€์ด - JavaScript

์šฉ๋‡ฝ 2023. 6. 10. 14:13
๋ฐ˜์‘ํ˜•

[๋ฐฑ์ค€]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)๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํ€ธ์„ ๋†“๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋Š” ๋ฒ”์œ„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๊ฐ€๋Šฅํ•œ ์กฐํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ํ–‰์˜ ์ด์ „ ํ–‰์œผ๋กœ ๋Œ์•„๊ฐˆ ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

์ฆ‰, ์ด ๋ฌธ์ œ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

ํŠน์ • ์œ„์น˜(๋…ธ๋“œ)๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํŒ๋ณ„ํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์ด๋•Œ ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜์ธ๊ฐ€ ์•„๋‹Œ๊ฐ€๋ฅผ ํŒ๋ณ„ํ•ด์•ผ ํ•œ๋‹ค.

ํ˜„์žฌ ๋†“์œผ๋ ค๋Š” ํ€ธ์ด ๊ธฐ์กด์— ์žˆ๋Š” ํ€ธ์˜ ์œ„์น˜์™€ ๋น„๊ตํ•˜๋ฉฐ

  1. ๊ฐ™์€ ํ–‰์— ์žˆ๋Š”์ง€ ํ™•์ธ: (x1 == x2) || (y1 == y2)
  2. ๋Œ€๊ฐ์„ ์— ์žˆ๋Š”์ง€ ํ™•์ธ: 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๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฐ˜์‘ํ˜•