개발/알고리즘

[백준] 9663번: N-Queen(C++)

Majangnan 2025. 5. 31. 18:23

문제 링크

https://www.acmicpc.net/problem/9663

 

 

코드 구현

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int N;

// 현재 행에 다른 퀸이 있는지
bool isSameRow(int placedRow, int currentRow)
{
	return placedRow == currentRow;
}

// 대각선에 다른 퀸이 있는지
bool isDiagonal(int placedCol, int placedRow, int currentCol, int currentRow)
{
	// 대각선에 있으면 가로 길이 차이 = 세로 길이 차이
	return abs(placedCol - currentCol) == abs(placedRow - currentRow);
}

// 퀸을 안전하게 배치할 수 있는지
bool isSafePosition(const vector<int>& queen, int col, int row)
{
	for (int i = 0; i < col; ++i)
	{
		// 같은 행이나 대각선에 퀸이 이미 있으면 false
		if (isSameRow(queen[i], row) || isDiagonal(i, queen[i], col, row))
		{
			return false;
		}
	}

	return true;
}

long long placeQueens(vector<int>& queen, int col)
{
	if (col == N)
		return 1;

	long long count = 0;

	for (int row = 0; row < N; ++row)
	{
		// 퀸을 놓을 수 있는 위치면 퀸을 배치
		if (isSafePosition(queen, col, row))
		{
			queen[col] = row;
			count += placeQueens(queen, col + 1);
			queen[col] = -1;
		}
	}

	return count;
}

int main()
{
	cin >> N;

	// queen[n] : n행 queen[n]열에 퀸이 있음
	vector<int> queen(N, -1);

	cout << placeQueens(queen, 0);

	return 0;
}

 

 

해결 방법


  • 백트래킹을 사용하여 연산 횟수 줄임
  • 같은 행 or 대각선상에 다른 퀸이 있으면 돌아감
  • n개의 퀸을 다 배치했다면 count 값 1증가