๐Ÿ“ Coding Test Study/Algorithm Problem

[C++][Baekjoon][Backtracking] 9663๋ฒˆ N-Queen ํ’€์ด

ibelieveinme 2021. 8. 5. 10:39
728x90

๋ฐฑํŠธ๋ž˜ํ‚น(Back Tracking)
- ์™„์ „ ํƒ์ƒ‰์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ถ„๊ธฐ(Branch)๋ฅผ ๊ฐ€์ง€์น˜๊ธฐ(Pruning)
- ํ•ด๋ฅผ ์ฐพ๋Š” ๋„์ค‘ ํ•ด๊ฐ€ ์•„๋‹ˆ์–ด์„œ ๋ง‰ํžˆ๋ฉด, ๋˜๋Œ์•„๊ฐ€์„œ ๋‹ค์‹œ ํ•ด๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ธฐ๋ฒ•

 

์ฆ‰, Backtracking์ด๋ž€, ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•ด brute-force(์ „๋ถ€ ์ผ์ผํžˆ ๋‹ค ํ•ด๋ณด๋Š” ๊ฒƒ)๋ฐฉ๋ฒ•์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ํ•œ์ • ํ•จ์ˆ˜(bounding function)์„ ์ด์šฉํ•ด ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ค„์—ฌ๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค.

 

[๊ด€๋ จ๋ฌธ์ œ]

 

9663๋ฒˆ: N-Queen

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

www.acmicpc.net

[ํ’€์ด]

1์ฐจ์› ํ–‰์—ด int queen_col[15] ์„ ์ด์šฉํ•ด์„œ ํ€ธ์˜ ์œ„์น˜๋ฅผ ์ €์žฅํ•œ๋‹ค.
์ด ๋•Œ, queen_col์˜ index๋Š” ํ–‰์„ ์˜๋ฏธํ•˜๊ณ , ์•ˆ์˜ ๊ฐ’๋“ค์€ ์—ด์„ ์˜๋ฏธํ•œ๋‹ค.

ํ€ธ์˜ ์œ„์น˜๋ฅผ ์ €์žฅํ•  ๋•Œ ๋‹ค์Œ 2๊ฐœ์˜ ์กฐ๊ฑด๋ฌธ์„ ํ™œ์šฉํ•ด์„œ queen์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๋ฅผ ํŒ๋‹จํ•œ๋‹ค.

 

    1. queen_col[col] == queen_col[row]
        0 1 2 3 <- ํ–‰์„ ์˜๋ฏธ
        ใ…ใ…ใ…ใ… <- ์—ด์˜ ์œ„์น˜๋ฅผ ์˜๋ฏธ

 

queen์€ ๊ฐ™์€ ์—ด/ํ–‰ ์ƒ์— ๋†“์ด๋ฉด ์•ˆ๋˜๋ฏ€๋กœ
col์„ +1 ํ•ด์ฃผ๋ฉฐ ๋Œ๋ฉด์„œ queen_col์— ๊ฐ™์€ ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.(๊ฐ™์€ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด, ๊ฐ™์€ ์—ด์— ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋‹ˆ๊น)

 

    2. abs(queen_col[row] - queen_col[col]) == (row - col)
        0 1 2 3 <- ํ–‰์„ ์˜๋ฏธ
        ใ…ใ…ใ…ใ… <- ์—ด์˜ ์œ„์น˜๋ฅผ ์˜๋ฏธ

 

queen_col[]๋Š” queen_col์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์ด๋ฏ€๋กœ ์—ด์„ ์˜๋ฏธํ•˜๊ณ 
row, col์€ inxex์ด๋ฏ€๋กœ ํ–‰์„ ์˜๋ฏธํ•œ๋‹ค.
ํ˜„์žฌ์ขŒํ‘œ์™€ ๋Œ€๊ฐ์„  ์ขŒํ‘œ์˜ ์—ด์˜ ์ฐจ์™€ ํ–‰์˜ ์ฐจ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋Œ€๊ฐ์„ ์— ์œ„์น˜ํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ ์ขŒํ‘œ๋Š” 0,0 ์ด๊ณ , ํ˜„์žฌ ์ขŒํ‘œ์˜ ๋Œ€๊ฐ์„  ์ขŒํ‘œ๋Š” 1,1 ์ผ ๋•Œ,
๊ฐ๊ฐ ์—ด์€ ์—ด๊ฐ’๋Œ€๋กœ, ํ–‰์€ ํ–‰๊ฐ’๋Œ€๋กœ ๋นผ๋ฉด 0 - 1 == 0 - 1 ์ด ์„ฑ๋ฆฝํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

[์ฝ”๋“œ]

#include <iostream>
using namespace std;

void N_Queen(int);

int N;//๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง€๋Š” ๊ฒŒ์ž„ํŒ์˜ ํฌ๊ธฐ
int queen_col[15];//ํ€ธ์˜ ์—ด์œ„์น˜๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด(queen_col์˜ ์ธ๋ฑ์Šค๋Š” ์ž์—ฐ์Šค๋ ˆ ํ–‰์„ ์˜๋ฏธํ•˜๊ฒŒ ๋œ๋‹ค)
int answer;//ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ˆ˜

bool isEmpty(int);//ํ–‰, ๋Œ€๊ฐ์„ ์— Queen์ด ์žˆ๋Š”์ง€ ํƒ์ƒ‰ํ•˜๋Š” ํ•จ์ˆ˜

int main() {
	cin >> N;

	N_Queen(0);//1. 0ํ–‰๋ถ€ํ„ฐ ํƒ์ƒ‰ ๋ฐ Queen ๋†“๊ธฐ ์‹œ์ž‘
	cout << answer;//7. ์ •๋‹ต ์ถœ๋ ฅ

	return 0;
}

void N_Queen(int row) {
	if (row == N) {//2. ํ˜„์žฌ ํƒ์ƒ‰ํ•˜๋Š” ํ–‰์ด ๋งˆ์ง€๋ง‰ ํ–‰์— ๋„๋‹ฌํ–ˆ๋‹ค๋ฉด queen์„ ๋ชจ๋‘ ๋ฐฐ์น˜ํ–ˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ answer + 1 ํ•ด์ฃผ๊ธฐ
		answer++;
		return;//โ˜…๋”์ด์ƒ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ  ๋ฆฌํ„ด(bounding function)
	}
	for (int col = 0; col < N; ++col) {//3. queen์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ด ํƒ์ƒ‰
		queen_col[row] = col;//4. ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” queen์˜ ์ž๋ฆฌ๋ฅผ ์ €์žฅํ•จ
		if (isEmpty(row)) {//5. ์•„๋ž˜์™€ ๋Œ€๊ฐ์„ ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํƒ์ƒ‰
			N_Queen(row + 1);//6. Queen ๋†“๊ณ  ๋‹ค์Œ ํ–‰ ํƒ์ƒ‰ํ•˜๋Ÿฌ gogo
		}
	}
}

bool isEmpty(int row) {
	for (int col = 0; col < row; col++) {//5-1. 0ํ–‰๋ถ€ํ„ฐ ํ˜„์žฌ ํ–‰๊นŒ์ง€ ๊ฒน์น˜๋Š” Queen์ด ์žˆ๋Š”์ง€ ํƒ์ƒ‰ํ•œ๋‹ค.
		if (queen_col[row] == queen_col[col] //5-2. ๊ฐ™์€ ์—ด์— ์žˆ๋Š”์ง€ ํƒ์ƒ‰
			|| abs(queen_col[row] - queen_col[col]) == (row - col)) {//5-3. ๋Œ€๊ฐ์„ ์— ์žˆ๋Š”์ง€ ํƒ์ƒ‰
				return false;//โ˜…Queen์„ ๋†“์„ ์ˆ˜ ์—†๋‹ค๋ฉด ๋”์ด์ƒ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ  return(bounding function)
		}
	}
	return true;
}
728x90