π12952 N-Queen
νλ‘κ·Έλλ¨Έμ€ N-Queen https://school.programmers.co.kr/learn/courses/30/lessons/12952
1. λ¬Έμ
- κ°λ‘, μΈλ‘ κΈΈμ΄κ° nμΈ μ μ¬κ°νμΌλ‘ λ 체μ€νμΈ μλ€.
- 체μ€ν μμ nκ°μ νΈμ΄ μλ‘λ₯Ό 곡격ν μ μλλ‘ λ°°μΉνλ €κ³ νλ€.
- μλ₯Ό λ€μ΄μ nμ΄ 4μΈ κ²½μ° λ€μκ³Ό κ°μ΄ νΈμ λ°°μΉνλ©΄ nκ°μ νΈμ μλ‘λ₯Ό νλ²μ 곡격ν μ μλ€.
체μ€νμ κ°λ‘ μΈλ‘μ μΈλ‘μ κΈΈμ΄ nμ΄ λ§€κ°λ³μλ‘ μ£Όμ΄μ§ λ, nκ°μ νΈμ΄ 쑰건μ λ§μ‘±νλλ‘ λ°°μΉν μ μλ λ°©λ²μ μλ₯Ό returnνλ solution ν¨μ λ§λ€κΈ°
- νΈ(Queen)μ κ°λ‘, μΈλ‘, λκ°μ μΌλ‘ μ΄λν μ μλ€.
- nμ 12μ΄νμ μμ°μμ΄λ€.
2. μ κ·Ό λ°©λ²
μ νμ μΈ λ°±νΈλνΉ λ¬Έμ μ΄κ³ DFSλ‘ μνκ³΅κ° νΈλ¦¬λ₯Ό ꡬνν΄μ νΈλ λ¬Έμ μ΄λ€. λ°±νΈλνΉμ λͺ¨λ κ²½μ°μ μλ₯Ό κ³ λ €ν΄μ ν΄λ₯Ό μ°Ύλ λ°©μμ΄λ€. μ΄λ¦μμ μ μΆν μ μλ―μ΄ ν΄κ° κ²μ(μΆμ )μ΄λΌλ λ»μ΄λ€. μ¦, ν΄λ₯Ό μ°ΎκΈ° μν΄μ ν보ꡰμ λμ΄νκ³ , λ£¨νΈ λ ΈλλΆν° μμν΄μ μ μ½ μ‘°κ±΄μ μ μ§μ μΌλ‘ 체ν¬νλ€. λ§μ½ 쑰건μ λ§μ§μλ€λ©΄, λ€λ‘ λμμμ(backtrack), λ°λ‘ λ€μ ν보ꡰμΌλ‘ λμ΄κ°λ€. λ°±νΈλνΉμμ κ²μν ν보λ€μ μν κ³΅κ° νΈλ¦¬(State Space Tree)λ‘ νννλ€.
- Promising : ν΄λΉ 루νΈκ° 쑰건μ λ§λμ§ κ²μ¬νλ κΈ°λ²
- Pruning(κ°μ§μΉκΈ°) : 쑰건μ λ§μ§ μμΌλ©΄ ν¬κΈ°νκ³ , λ€λ₯Έ 루νΈλ‘ λ°λ‘ λμμμ νμμ μκ°μ μ μ½νλ€.
3. μ λ΅μ½λ
class Solution {
int count; // ν΄λμ€ λ 벨 λ³μλ‘ μ μΈ
public int solution(int n) {
count = 0;
int[] queens = new int[n]; // index: ν, value: μ΄
placeQueen(0, n, queens);
return count;
}
// row: νμ¬ λ°°μΉν ν, n: 체μ€ν ν¬κΈ°, queens: νμ¬κΉμ§ λ°°μΉλ νΈ μ 보
private void placeQueen(int row, int n, int[] queens) {
if (row == n) {
count++; // λͺ¨λ νμ νΈ λ°°μΉ μλ£
return;
}
for (int col = 0; col < n; col++) {
if (isAvailable(row, col, queens)) {
queens[row] = col; // νΈ λ°°μΉ
placeQueen(row + 1, n, queens); // λ€μ ν μ¬κ· νΈμΆ
}
}
}
// νμ¬ μμΉμ νΈμ λμ μ μλμ§ μ²΄ν¬
private boolean isAvailable(int row, int col, int[] queens) {
for (int i = 0; i < row; i++) {
// κ°μ μ΄ λλ λκ°μ μ νΈμ΄ μλ κ²½μ°
if (queens[i] == col || Math.abs(queens[i] - col) == row - i) {
return false;
}
}
return true;
}
}
λ°°μ΄λ‘ νμλ€. μ΄ λ¬Έμ λ μ΄λ―Έμ²΄μ€νμ΄ 4*4λ‘ κ³ μ λμ΄ μκΈ° λλ¬Έμ λμ ν¬κΈ° κ΄λ¦¬ μμ΄ λ°°μ΄μ μ΄ κ²μ΄λ€.
μ 체 νλ¦μ μ΄λ κ² μ§°λ€.
- count μ΄κΈ°ν: κ°λ₯ν λ°°μΉ μλ₯Ό μΈκΈ° μν λ³μ
- queens λ°°μ΄ μμ±: κ° νμ μ΄λ€ μ΄μ νΈμ΄ λμλμ§ μ μ₯
- 첫 λ²μ§Έ ν(row = 0)λΆν° μ¬κ· νΈμΆ μμ
- λ§μ§λ§μ μ΄ κ²½μ°μ μ λ°ν
1. placeQueen(int row, int n, int[] queens)
- νμ¬ ν(row)μ νΈ λλ ν¨μμ΄λ€
- μ’ λ£ μ‘°κ±΄μ row == n μ΄λ κ² λλ©΄ λͺ¨λ νμ νΈ λ°°μΉκ° μλ£ λ μνλκΉ count++μ νλ€.
- λ°λ³΅λ¬ΈμΌλ‘ 0 ~ n-1μ΄κΉμ§ νΈμ λμ μ μγ΄λμ§ κ²μ¬νλ€.
- isAvailable μ²΄ν¬ ν κ°λ₯νλ©΄
- queens[row] = col : νμ¬ νμ νΈ λ°°μΉ κΈ°λ‘
- placeQueen(row + 1, ...) β λ€μ ν νμ(μ¬κ·)
queens[row] = col
- queens λ°°μ΄μ κ° ν(row)μ μ΄λ€ μ΄(col)μ νΈμ΄ μλμ§ κΈ°λ‘νλ μ©λμ΄λ€.
- λ°°μ΄μμ queens[i] = j λΌλ©΄ iν jμ΄μ νΈμ λ°°μΉνλ κ²μ΄λ€.
- μλ₯Ό λ€μ΄, queens[2] = 3μ΄λ©΄ 2ν 3μ΄μ νΈμ΄ λμλ€λ μλ―Έμ΄λ€.
- μ΄ ν μ€μ΄ λ°λ‘ νΈμ 체μ€νμ λλ κ²μ²λΌ κΈ°λ‘νλ μ½λμ΄λ€.
- μ€μ λ‘ μ²΄μ€νμ κ·Έλ¦¬μ§ μκ³ λ°°μ΄λ‘ μμΉ μ λ³΄λ§ μ μ₯νλ€.
placeQueen(row + 1, n, queens)
- row + 1 β λ€μ ν(row)μ νΈμ λκΈ° μν΄ μ¬κ· νΈμΆ
- μ¦, νμ¬ νμ νΈμ λ°°μΉν μνμμ λ€μ ν νμμ μμνλ κ²μ΄λ€.
2. isAvailable λ©μλ
- νμ¬ μμΉ (row, col)μ νΈμ λμ μ μλμ§ κ²μ¬νλ ν¨μμ΄λ€.
- κ²μ¬ λμ: νμ¬ νλ³΄λ€ μμ μλ νΈλ€ (i < row)
- μ²΄ν¬ μ‘°κ±΄:
- queens[i] == col β κ°μ μ΄μ μ΄λ―Έ νΈ μμ β λμ μ μμ
- Math.abs(queens[i] - col) == row - i β λκ°μ μ νΈ μμ β λμ μ μμ
- λ λ€ μλλ©΄ μμ β true λ°ν
λκ°μ νμ
Math.abs(queens[i] - col) == row - i
iνμ λμΈ νΈμ μ΄ μμΉμμ νμ¬ λμΌλ €λ νΈμ μ΄ μμΉλ₯Ό λΊ κ°κ³Ό νμ¬ νΈμ λμΌλ €λ νκ³Ό μ΄λ―Έ νΈμ΄ λμΈ μ΄μ νμ λΉκ΅νλ κ²μ΄λ€.
체μ€μμ νΈμ κ°λ‘,μΈλ‘, λκ°μ μΌλ‘ 곡격 κ°λ₯νλ° λ μ’νκ° λκ°μ μ μμΌλ©΄ νμ°¨μ΄ = μ΄μ°¨μ΄λΌλ νΉμ±μ μ΄μ©νκ²μ΄λ€.
λ€μλ§ν΄
Math.abs(ν1 - ν2) == Math.abs(μ΄1 - μ΄2)
μ¬κΈ°μ:
ν1 - ν2
βrow - i
μ΄1 - μ΄2
βcol - queens[i]
κ·Έλμ λκ°μ μΆ©λ 체ν¬λ μλμ κ°λ€.
Math.abs(queens[i] - col) == row - i
μλ₯Ό λ€μ΄, νΈμ΄ (2,3)μ μκ³ , μλ‘μ΄ νΈμ (4,5)μ λλ €κ³ νλ©΄
- ν μ°¨μ΄: 4 - 2 = 2
- μ΄ μ°¨μ΄: 5 - 3 = 2
λμ΄ κ°μΌλ―λ‘ λκ°μ 곡격 κ°λ₯ β λμ μ μμ μ리μ΄λ€.
isAvailable λ©μλ λ²μ
for (int i = 0; i < row; i++)
iλ μ΄μ μ λ°°μΉν νΈλ€μ ν λ²νΈλ₯Ό λνλΈλ€. νμ¬ νΈμ λμΌλ €λ rowλ³΄λ€ μμ νλ€λ§ νμΈνλ©΄ μΆ©λΆνκΈ° λλ¬Έμ λ²μκ° μ΄λ κ² λλ€. μλνλ©΄ λ°±νΈλνΉμ μμμ μλλ‘ ν νμ© νΈμ λ°°μΉνκΈ° λλ¬Έμ, row μ΄ν νμλ μμ§ νΈμ΄ μκΈ° λλ¬Έμ΄λ€. μ¦ νμ¬ νΈλ³΄λ€ μ νμ μλ νΈλ€λ§ νμΈνλ κ²μ΄λ€.
μ: νμ¬ νΈμ 3νμ λμΌλ €λ©΄
- 0, 1, 2νμ μ΄λ―Έ λμΈ νΈλ€κ³Όλ§ μΆ©λ 체ν¬
- 3ν μ΄νλ μμ§ λ°°μΉ μ λ¨ β μ²΄ν¬ λΆνμ
μ²μμλ i <= rowλ i < queens.lengthλ‘ ν΄μ νλ Έλλ° row μ΄μ νκΉμ§λ§ κ²μ¬ν΄μΌ μ΄λ―Έ λμ νΈλ€κ³Όμ μΆ©λ 체ν¬κ° κ°λ₯νλ€.