Algorithm/Programmers
[Algorithm] Programmers :: N-Queen
MaxLevel
2023. 5. 26. 22:38
https://school.programmers.co.kr/learn/courses/30/lessons/12952
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
int queens[12] = { 0 };
int targetSize = 0;
int answer = 0;
bool check(int curY, int curX) // 윗행들의 퀸검사해서 놓을 수 있는지
{
for (int i = 0; i < curY; ++i) // 윗행들검사.
{
int prevY = i;
int prevX = queens[i];
if (prevX == curX) return false; // 같은 열에 있으니까
if (prevY - prevX == curY - curX) return false;// 5시
if (prevY + prevX == curY + curX) return false;// 7시
}
return true;
}
void DFS(int y, int count)
{
if (count == targetSize)
{
++answer;
return;
}
for (int i = 0; i < targetSize; ++i)
{
if (check(y, i)) // 놓을 수 있으면
{
queens[y] = i;
DFS(y + 1, count + 1);
}
}
}
int solution(int n)
{
targetSize = n;
for (int i = 0; i < n; ++i)
{
queens[i] = -1;
}
for (int i = 0; i < n; ++i) // 열진행
{
queens[0] = i; // 0,i 에 퀸을 뒀다는 뜻.
DFS(1, 1);
}
return answer;
}
|
cs |
복기겸 풀어본 문제.
대각선검사는 저렇게 따로 해도되고, 한번에 할 수 있는 방법도 있다.
if (abs(curRow - prevY) == abs(curCol - prevX)) return false;