알고리즘 공부
99클럽 코테 스터디 16일차 TIL
HD9504
2024. 8. 6. 23:26
오늘의 학습 키워드
- 백트래킹 (Backtracking)
- N-Queen 문제
문제 이해
N-Queen 문제는 N x N
크기의 체스판 위에 N개의 퀸을 서로 공격하지 못하도록 배치하는 방법의 수를 구하는 문제입니다. 퀸은 같은 행, 열, 대각선에 위치한 다른 퀸을 공격할 수 있기 때문에 이를 피하면서 배치를 찾아야 합니다.
나의 풀이
class Solution {
int N;
int[] visited;
int answer = 0;
public int solution(int n) {
N = n;
visited = new int[N];
dfs(0);
return answer;
}
public void dfs(int checked){
if (checked == N){
answer++;
return;
}
for (int i = 0; i < N; i++) {
if (canCheck(checked, i)){
visited[checked] = i;
dfs(checked + 1);
}
}
}
public boolean canCheck(int row, int col){
for (int i = 0; i < row; i++) {
if(visited[i] == col){ //가로 확인
return false;
}else if(Math.abs(row - i) == Math.abs(col - visited[i])){ //대각선 확인
return false;
}
}
return true;
}
}
풀이 설명
초기화
N
은 체스판의 크기이자, 퀸의 수를 의미합니다. 이 변수는 입력값n
으로 초기화됩니다.visited
배열은 각 행에 퀸이 배치된 열의 위치를 기록합니다.answer
는 가능한 퀸 배치의 수를 기록합니다.
백트래킹을 통한 퀸 배치
dfs
메소드는 퀸을 배치할 수 있는 모든 방법을 탐색합니다.checked
는 현재까지 배치한 퀸의 수를 의미합니다. 만약checked
가N
에 도달하면, 하나의 유효한 배치가 완성된 것으로 간주하고answer
를 증가시킵니다.- 각 행에서 가능한 모든 열을 검사하여 퀸을 배치합니다. 퀸을 배치할 수 있는지 여부는
canCheck
메소드로 판단합니다.
퀸 배치 가능 여부 확인
canCheck
메소드는 주어진 행(row
)에 퀸을 배치할 수 있는지 확인합니다.- 이미 같은 열에 퀸이 있는지, 또는 대각선으로 퀸이 배치되어 있는지를 검사하여 불가능한 경우
false
를 반환합니다. 이 두 조건을 모두 통과하면true
를 반환하여 해당 위치에 퀸을 배치할 수 있음을 알립니다.
결과 반환
- 모든 가능한 퀸 배치를 탐색한 후,
answer
에 기록된 퀸 배치의 수를 반환합니다.
- 모든 가능한 퀸 배치를 탐색한 후,
오늘의 회고
- dfs를 이용한 백트래킹 문제였다.