https://school.programmers.co.kr/learn/courses/30/lessons/12952
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
n개의 퀸이 서로를 공격할 수 없도록 배치하는 방법.
퀸을 순열로 배치하면 된다. 그런데 퀸을 배치할 때 고려해야 하는 요소는 무엇일까?
그건 바로 다른 퀸들의 위치이다. 퀸을 놓을 때 다른 퀸들을 공격할 수 있는 위치라면 놓아서는 안된다.
그렇다면 관리해야 할 것은? 이전에 놓았던 퀸들의 위치를 관리해야 한다. 어차피 같은 row에는 놓을 수 없으므로 퀸들의 위치는 1차원 배열로 col만 관리하면 될 것 같다.
- row를 0~n까지 순회하면서 퀸을 놓을 col을 결정한다.
- 이때 이전 row에 위치한 퀸들과의 관계를 고려해 퀸을 놓는다.
class Solution {
static int[] cols;
static int answer = 0;
public int solution(int n) {
cols = new int[n];
dfs(0, n);
return answer;
}
private void dfs(int row, int n) {
if (row == n) {
answer++;
return;
}
for (int col = 0; col < n; col++) {
if (isPossible(row, col)) {
cols[row] = col;
dfs(row + 1, n);
cols[row] = 0;
}
}
}
private boolean isPossible(int row, int col) {
// row, col = 현재 놓을 위치
for (int prevRow = 0; prevRow < row; prevRow++) {
// 이전 row에 놓았던 것들
int prevCol = cols[prevRow];
if (col == prevCol) return false;
if (row + col == prevRow + prevCol) return false;
if (row - col == prevRow - prevCol) return false;
}
return true;
}
}
주의해야 할 점은 직전 row에 대해서만 검사하는 것이 아니라 이전 모든 row들에 대해 검사를 진행해야 한다는 점이다.
'Algorithm > Programmers' 카테고리의 다른 글
Programmers 60062 - 외벽점검 (0) | 2024.10.20 |
---|---|
Programmers 92342 - 양궁대회 (0) | 2024.10.02 |
Programmers 87946 - 피로도 (0) | 2024.10.01 |
Programmers 86971 - 전력망을 둘로 나누기 (1) | 2024.09.30 |
Programmers 67259 - 경주로 건설 (0) | 2024.09.30 |