백준 9663번 : N-Queen [C#]
2026. 2. 26. 02:59ㆍCS/알고리즘
1. 모든 경우의 수를 다 체크하는 것 밖에 방법이 없을 것 같은데 윗줄부터 좌표로 접근해볼까?
> N*N 보드판에 퀸 N개를 놓으려면 같은 줄에 놓을 수 없으니까 모든 행과 열마다 퀸이 하나씩 들어가야겠다.
> 일단 이미 퀸이 있는 행엔 다른 퀸을 놓을 수 없으니 검사할 필요 없이 다음 행으로 넘어가자
> 순회하면서 이번 회차에 퀸을 저장한 좌표를 기억해둬야겠다. 그리고 순회의 끝에 도달했으면 퀸을 하나씩 빼서 다음 경우의 수가 있는지 확인해야겠다.
2. 루프를 돌면서 그 좌표에 놓을 수 있는지 확인하는 방법은?
> 행은 다르니까 열도 다른 퀸들과 다른지 확인하고, 대각선으로도 다른지 확인해야 한다.
> 열은 저장했던 퀸의 좌표와 비교한다.
3. 대각선이 같은 점들의 공통점이 뭘까?
> 왼쪽 위 > 오른쪽 아래로 긋는 대각선은 x-y값이 같고, 왼쪽 아래 > 오른쪽 위로 긋는 대각선은 x+y의 값이 같았다.
using System.Text;
class Program
{
static int N;
static int result = 0;
static int[] pos; // pos[y] = x 에서 queen의 좌표는 x,y이다. 재귀를 y축을 기준으로 돌릴 거라
// y행 x열에 queen을 놓았다는 뜻.
static void Queen(int y)
{
if(y == N)
{
result ++;
return;
}
for(int x=0; x<N; x++)
{
if(IsSafe(x, y))
{
pos[y] = x; // 퀸을 놓고
Queen(y+1); // 다음 행으로 이동
// isSafe 검사에서 현재 y값 이전까지만 검사하고 만약 값이 바뀐다면
// 덮어씌우기 때문에 상태 복구할 필요 없다.
}
}
}
static bool IsSafe(int x, int y)
{
// 같은 열인지 검사,
for(int i=0; i<y; i++)
{
if(pos[i] == x) return false;
}
// 대각선에 해당하는지 검사
for(int i=0; i<y; i++)
{
if( (pos[i]- i) == (x-y) || (pos[i] + i) == (x+y) ) return false;
}
return true;
}
static void Main()
{
N = int.Parse(Console.ReadLine());
pos = new int[N];
Queen(0);
Console.Write(result);
}
}
'CS > 알고리즘' 카테고리의 다른 글
| 백준 11054번 : 가장 긴 바이토닉 부분 수열 [C#] (0) | 2026.03.03 |
|---|---|
| 백준 2580번 : 스도쿠 [C#] (0) | 2026.02.26 |
| 백준 2447번 : 별 찍기 -10 [C#] (0) | 2026.02.24 |
| [C#] Baekjoon용 C# 문법 (0) | 2026.02.11 |
| [C++] 코딩 테스트 대비용 C++ 문법 정리 (0) | 2025.01.15 |