[Baekjoon] 9663 - πŸ‘‘N-Queen

ChobbyΒ·2023λ…„ 11μ›” 29일
1

Baekjoon

λͺ©λ‘ 보기
106/108

πŸ˜€λ¬Έμ œ

N-Queen λ¬Έμ œλŠ” 크기가 N Γ— N인 체슀판 μœ„μ— ν€Έ N개λ₯Ό μ„œλ‘œ 곡격할 수 μ—†κ²Œ λ†“λŠ” λ¬Έμ œμ΄λ‹€.

N이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 퀸을 λ†“λŠ” λ°©λ²•μ˜ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.


πŸ˜μž…λ ₯

첫째 쀄에 N이 주어진닀. (1 ≀ N < 15)


πŸ˜‚μΆœλ ₯

첫째 쀄에 ν€Έ N개λ₯Ό μ„œλ‘œ 곡격할 수 μ—†κ²Œ λ†“λŠ” 경우의 수λ₯Ό 좜λ ₯ν•œλ‹€.


🀣예제

예제 μž…λ ₯ 1 
8
예제 좜λ ₯ 1 
92

πŸ˜ƒμΆœμ²˜

  • 문제λ₯Ό λ§Œλ“  μ‚¬λžŒ: baekjoon

πŸ˜„μ•Œκ³ λ¦¬μ¦˜ λΆ„λ₯˜

  • 브루트포슀 μ•Œκ³ λ¦¬μ¦˜
  • λ°±νŠΈλž˜ν‚Ή

πŸ˜Žλ‚˜μ˜ν’€μ΄

ν•΄λ‹Ή λ¬Έμ œλŠ” 일반적인 2차원 λ°°μ—΄ νƒμƒ‰μœΌλ‘  μ‹œκ°„μ΄ˆκ³Όλ₯Ό 막을 방도가 μ—†λ‹€.
본인의 경우 ν•œ 열에 ν•˜λ‚˜μ˜ 퀸을 λ†“λŠ”λ‹€λŠ” μ‚¬κ³ λ°©μ‹μœΌλ‘œ λ‚˜λ¦„μ˜ μ΅œμ ν™”λ₯Ό ν•˜λ©° λ°±νŠΈλž˜ν‚Ήν–ˆμœΌλ‚˜ μ‹œκ°„ 초과

해닡은 N-Queen 문제의 νŒ¨ν„΄μ— μžˆλ‹€.

νŠΉμ • μ’Œν‘œ (row, col)κ°€ μžˆλ‹€ κ°€μ •ν–ˆμ„ λ•Œ,

  • ↙ ν•΄λ‹Ή λ°©ν–₯의 λŒ€κ°μ„  μ’Œν‘œ νŠΉμ§•μ€ (row+col) 이 λͺ¨λ‘ κ°™λ‹€. ex) (0,5) (1,4) (2,3)
  • β†˜ ν•΄λ‹Ή λ°©ν–₯의 λŒ€κ°μ„  μ’Œν‘œ νŠΉμ§•μ€ (row-col) 이 λͺ¨λ‘ κ°™λ‹€. ex) (1,1) (2,2) (3,3)
    • ν•˜μ§€λ§Œ μœ„ 방식 λŒ€λ‘œλΌλ©΄, (2,3) μ’Œν‘œμ˜ ν•΄λ‹Ή λ°©ν–₯ λŒ€κ°μ„ μ€ μŒμˆ˜κ°€ λ‚˜μ˜¬ 수 μžˆκΈ°μ—, λͺ¨λ‘ num-1을 더해쀀 κ°’μœΌλ‘œ κ³„μ‚°ν•œλ‹€.
const input = require('fs').readFileSync('/dev/stdin').toString().trim()
const num = Number(input)
const board = Array.from({length: num}, () => Array(num).fill(false))
let result = 0
let cols = new Array(num).fill(false)
// μ‘΄μž¬ν•  수 μžˆλŠ” λͺ¨λ“  ν•΄λ‹Ή λ°©ν–₯의 λŒ€κ°μ„  μˆ˜λŠ” 2*num-1
let diag1 = new Array(2*num-1).fill(false)
let diag2 = new Array(2*num-1).fill(false)

function isValid(row, col) {
    // diag1: 우츑 λŒ€κ°, diag2: μ’ŒμΈ‘λŒ€κ°(row-col μŒμˆ˜κ°€ λ‚˜μ˜¬ 수 μžˆμœΌλ―€λ‘œ, num-1 μΆ”κ°€)
    return !(cols[col] || diag1[row+col] || diag2[row-col+num-1])
}

function mineQueen(row) {
    if(row === num) {
        result++
        return
    } 
    for(let i = 0; i < num; i++) {
        if(!isValid(row, i)) continue
        board[row][i] = true
        cols[i] = true
        diag1[row+i] = true
        diag2[row-i+num-1] = true
        mineQueen(row+1)
        board[row][i] = false
        cols[i] = false
        diag1[row+i] = false
        diag2[row-i+num-1] = false
    }
}

mineQueen(0)
console.log(result)
profile
λ‚΄ 지식을 κ³΅μœ ν•  수 μžˆλŠ” λŒ€λ‹΄ν•¨

0개의 λŒ“κΈ€