728x90
여덟 퀸 문제 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 8 퀸 문제는 8x8크기의 체스판에 퀸을 8개 배치하는 문제이다. 1848년 막스 베첼이 처음 제안하였다. 이 문제를 일반화하면 NxN 크기의 체스판에 퀸을 N개 배치하는
ko.wikipedia.org
📌오늘의 학습 키워드
- 백트래킹
✨공부한 내용 본인의 언어로 정리하기
- N x N에 N개의 퀸을 놓으려면 각 열에 적어도 한개의 퀸이 놓여야 한다.
📚오늘의 회고
-
- 제대로된 종료조건을 찾지 못해서 헤맸다.
- 한개씩 퀸을 배치하고, 해당 퀸의 영향력을 MAP에 표시하고
- 다시 그 영향력이 미치지 않는 곳을 찾아서 퀸을 놓은 후에
- 마지막에는 나머지 빈 공간을 모두 세는 것으로 알고리즘을 만들어봤는데
- 😅 여기에는 퀸을 각각 다르게 본다는 치명적인 오류가 있었다.
- 너무 시간을 오래 써서 지피티에게 도움 요청
- N x N에 N개의 퀸을 놓으려면 각 열에 적어도 한개의 퀸이 놓여야 한다.
- col = 열 (같은 열 배치 방지)
- diag1 ↘ = queen_row + c
- diag2 ↙ = queen_row - c + N (음수 방지를 위해 N 더하기)
[🤓문제 해결 코드]
더보기
import java.io.*;
public class Main {
static int N;
static int total;
static boolean[] col, diag1, diag2;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
col = new boolean[N];
diag1 = new boolean[2 * N]; // ↘ 대각선
diag2 = new boolean[2 * N]; // ↙ 대각선
DFS(0);
System.out.println(total);
}
private static void DFS(int queen_row) {
if (queen_row == N) {
total++;
return;
}
for (int c = 0; c < N; c++) {
if (col[c] || diag1[queen_row + c] || diag2[queen_row - c + N]) continue;
// 퀸을 배치
col[c] = diag1[queen_row + c] = diag2[queen_row - c + N] = true;
DFS(queen_row + 1);
col[c] = diag1[queen_row + c] = diag2[queen_row - c + N] = false; // 백트래킹
}
}
}
728x90
'코딩테스트' 카테고리의 다른 글
백준 11404 플로이드 (0) | 2025.02.18 |
---|---|
삼성 SDS 2025년도 상반기 알고리즘 특강 기록 (0) | 2025.02.18 |
Java String 코테 준비용 (0) | 2025.01.31 |
백준 13317 한 번 남았다 (0) | 2025.01.25 |
백준 2179 비슷한 단어 (0) | 2025.01.23 |