๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

[BOJ] 9663๋ฒˆ | N-Queen (C++)

category ๐Ÿค–Algorithm/BOJ 2023. 5. 1. 16:28
728x90
๐Ÿ”—๋ฌธ์ œ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ
 

9663๋ฒˆ: N-Queen

N-Queen ๋ฌธ์ œ๋Š” ํฌ๊ธฐ๊ฐ€ N × N์ธ ์ฒด์ŠคํŒ ์œ„์— ํ€ธ N๊ฐœ๋ฅผ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋†“๋Š” ๋ฌธ์ œ์ด๋‹ค. N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ€ธ์„ ๋†“๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

www.acmicpc.net

 

 

๋ฌธ์ œ ์„ค๋ช…

N-Queen ๋ฌธ์ œ๋Š” ํฌ๊ธฐ๊ฐ€ N × N์ธ ์ฒด์ŠคํŒ ์œ„์— ํ€ธ N๊ฐœ๋ฅผ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋†“๋Š” ๋ฌธ์ œ์ด๋‹ค.
N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ€ธ์„ ๋†“๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N < 15)

 


์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํ€ธ N๊ฐœ๋ฅผ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋†“๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 


์˜ˆ์ œ ์ž…์ถœ๋ ฅ

 


ํ’€์ด ์ „๋žต

\( N \times N\) ์ฒด์ŠคํŒ์—์„œ ํ€ธ์ด ์„œ๋กœ ๊ณต๊ฒฉ์„ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋†“๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

ํ€ธ์€ ์ž์‹ ์ด ๋†“์ธ ์œ„์น˜๋กœ๋ถ€ํ„ฐ ๊ฐ™์€ ์ผ์ž ์„ ์ƒ ๋ฐ ๋Œ€๊ฐ์„ ์ƒ๊นŒ์ง€ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๊ธฐ ์ฒด์Šค๋ง์ž…๋‹ˆ๋‹ค. (๊ทธ์— ๋น„ํ•ด ํ‚น์€...)

์ฆ‰, ํ€ธ์ด ๋†“์ธ ์œ„์น˜๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋ฉด, ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ์น ํ•ด์ง„ ์œ„์น˜๋Š” ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

4 X 4 ํฌ๊ธฐ์˜ ์ฒด์ŠคํŒ์—์„œ ํ€ธ ํ•˜๋‚˜๋ฅผ ๋†“์•˜์„ ๋•Œ, ํ”ผํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ๋กœ(๋นจ๊ฐ„์ƒ‰)

 

๊ทธ๋ ‡๊ธฐ์—, ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด ํ˜„์žฌ ์ขŒํ‘œ์— ํ€ธ์„ ๋†“์•˜์„ ๋•Œ ํ€ธ ๊ณต๊ฒฉ๋กœ ์ƒ์— ๋˜ ๋‹ค๋ฅธ ํ€ธ์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค์ƒ ์ƒํ•˜์ขŒ์šฐ์™ผ์œ„ ๋Œ€๊ฐ์™ผ์•„๋ž˜ ๋Œ€๊ฐ์˜ค๋ฅธ์œ„ ๋Œ€๊ฐ์˜ค๋ฅธ์•„๋ž˜ ๋Œ€๊ฐ ์ด๋ ‡๊ฒŒ ์ด 8๊ฐœ์˜ ๊ณต๊ฒฉ๋กœ๊ฐ€ ์กด์žฌํ•˜์ฃ .

 

์ฒ˜์Œ์—๋Š” ์ €๋ ‡๊ฒŒ 8๋ฐฉํ–ฅ์„ ๋ชจ๋‘ ๊ฒ€์‚ฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งฐ์—ˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๊ตฌ์š”.

๊ทธ๋ž˜์„œ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ์„ ๋” ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

 

์‹œ๊ฐ„ ์†Œ์š”๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋ฐฉ์•ˆ๋“ค

์ €๋Š” (0, 0)์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์—ด(Column)์„ ์šฐ์„ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, 4 X 4 ์ฒด์ŠคํŒ์ด๋ผ๋ฉด, (0, 0) -> (0, 1) -> (0, 2) -> (0, 3) -> (2, 0) ... ์ด๋Ÿฐ ์‹์œผ๋กœ ์—ด์„ ๋จผ์ € ๊ฒ€์‚ฌํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

 

๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ์‹์ด ์ด๋Ÿฌํ•˜๋‹ค๋ฉด, ๋‹ค์Œ ์‚ฌํ•ญ๋“ค์„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ•œ ํ–‰(Row)์— ์žˆ๋Š” ์—ด(Column)๋“ค ์ค‘ ์–ด๋–ค ๊ณณ์ด๋ผ ํ€ธ์„ ํ•˜๋‚˜ ๋ฐฐ์น˜ํ•œ๋‹ค๋ฉด, ๊ทธ ํ–‰์—๋Š” ๋” ์ด์ƒ ํ€ธ์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์—†๋‹ค.
    • ์ฆ‰, ํ•ด๋‹น ํ–‰์— ํ€ธ์„ ๋ฐฐ์น˜ํ–ˆ๋‹ค๋ฉด ๋‹ค์Œ ํ–‰์œผ๋กœ ๋„˜์–ด๊ฐ€์„œ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.

0ํ–‰ 0์—ด์— ํ€ธ์„ ๋ฐฐ์น˜ํ–ˆ์œผ๋ฏ€๋กœ, 0ํ–‰ 1, 2, 3์—ด์ชฝ์œผ๋กœ ๋ฐฐ์น˜ ์ง„ํ–‰์„ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

  • ์ฒด์ŠคํŒ ์œ„์ชฝ๋ถ€ํ„ฐ ํ€ธ ๋ฐฐ์น˜๋ฅผ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ, ์•„๋ž˜์ชฝ ๋ฐฉํ–ฅ ํƒ์ƒ‰์„ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
    • ์ฒด์ŠคํŒ ์œ„์ชฝ๋ถ€ํ„ฐ ํ€ธ ๋ฐฐ์น˜๋ฅผ ํ•˜๋ฏ€๋กœ, ์ฒด์ŠคํŒ ์•„๋ž˜์ชฝ์—๋Š” ๋‹น์—ฐํžˆ ํ€ธ์ด ์—†์œผ๋‹ˆ ํƒ์ƒ‰์„ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
    • ์ฆ‰, ํƒ์ƒ‰ ๋ฐฉํ–ฅ์€ ์œ„์™ผ์ชฝ ์œ„ ๋Œ€๊ฐ์˜ค๋ฅธ์ชฝ ์œ„ ๋Œ€๊ฐ ์ด๋ ‡๊ฒŒ ์„ธ ๊ตฐ๋ฐ๋งŒ ํƒ์ƒ‰ํ•˜๋ฉด ๋œ๋‹ค.

ํ˜„์žฌ ๋ฐฐ์น˜ ์ง„ํ–‰ ์ค‘์ธ ์œ„์น˜๊ฐ€ (1, 1)์ด๋ฏ€๋กœ ๊ทธ ์•„๋ž˜ ํ–‰๋“ค(2, 3)๋“ค์—๋Š” ๋‹น์—ฐํžˆ ํ€ธ์ด ์—†์–ด ํƒ์ƒ‰ํ•  ํ•„์š” X

 

์ด์ œ ๋ฐฑํŠธ๋ž˜ํ‚น(Backtracking)์„ ์ง„ํ–‰ํ•˜๋ฉฐ, ์œ„ ๊ณผ์ •๋“ค์„ ๋ฐ˜๋ณตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ณผ์ •์„ ํ•œ ๋ฒˆ ์ฒจ๋ถ€ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

 

 


์†Œ์Šค ์ฝ”๋“œ ๋ฐ ๊ฒฐ๊ณผ

#include <iostream>
#include <vector>
using namespace std;

bool CheckQueenExisting(vector<vector<bool>>& chessBoard, int row, int column) {
    for (int i = 0; i < row; i++) {
        if (chessBoard[i][column])     // ๋งจ ์œ„ ํ–‰๋ถ€ํ„ฐ ํ˜„์žฌ ํ–‰๊นŒ์ง€ ๊ฐ™์€ ์—ด์— ํ€ธ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ
            return true;

        int colDiff = row - i;
        if (column - colDiff >= 0 && chessBoard[i][column - colDiff])  // ์™ผ์ชฝ ์œ„ ๋Œ€๊ฐ์„  ๊ฒ€์‚ฌ
            return true;

        if (column + colDiff < chessBoard.size() && chessBoard[i][column + colDiff])  // ์˜ค๋ฅธ์ชฝ ์œ„ ๋Œ€๊ฐ์„  ๊ฒ€์‚ฌ
            return true;
    }
    return false;
}


int NQueen(vector<vector<bool>>& chessBoard, int currentRow) {
    if (currentRow == chessBoard.size())
        return 1;

    int answer = 0;
    for (int column = 0; column < chessBoard.size(); column++) {
        if (!CheckQueenExisting(chessBoard, currentRow, column)) {
            chessBoard[currentRow][column] = true;
            answer += NQueen(chessBoard, currentRow + 1);
            chessBoard[currentRow][column] = false;
        }
    }
    return answer;
}

int main() {
    cout.tie(NULL);
    cin.tie(NULL);
    ios::sync_with_stdio(false);

    int N;
    cin >> N;

    vector<vector<bool>> chessBoard(N, vector<bool>(N, false));
    cout << NQueen(chessBoard, 0);
    return 0;
}

 

728x90
๋ฐ˜์‘ํ˜•