λ¬Έμ
νμ΄
μ²μμ μκ°νλ λ°©λ²μ μμ νμμ ν΅ν΄ μ΅λ μλ₯Ό μ°Ύλ λ°©λ²μ΄μλ€. μ€κ°μ κ°μ§μΉκΈ°λ₯Ό ν΅ν΄ μκ°μ μ€μΌ μ μκ² μ§λ§ nμ μ΅λκ°μ΄ 100μ΄κ³ (λͺ¨λ μ μ λν΄ λλ κ²½μ°/ λμ§ μλ κ²½μ°) * (λμ μ μλμ§ νλ¨νκΈ° μν΄ μ λκ°μ μ νμνλ κ²½μ°)λ₯Ό νκ² λλ©΄ O(2^n * n)μ΄κΈ° λλ¬Έμ μκ°μ΄κ³Όκ° λ°μν κ² κ°μμ λ€λ₯Έ λ°©λ²μ μκ°ν΄λ΄€λ€.
μκ°ν λ°©λ²μ N-Queensμμ λͺ¨λ νλ ¬μ μ μ₯νμ§ μκ³ ν΄λΉ idxμλ νλμ κ°λ§ μ¬ μ μλλ‘ νλ€λ©΄ μκ°μ μ€μΌ μ μλ€λ μκ°μ νκ³ λ°μ΄ν°λ₯Ό μ΄λ»κ² λ¬Άμ΄μΌ ν μ§ κ³ λ―Όμ ν΄λ΄€λ€. N-Queensμμ queenμ κ°λ‘,μΈλ‘λ₯Ό κ° μ μμκ³ μ΄λ‘ μΈν΄ νλμ νμ νΈμ λμ κ²½μ°μλ κ°μ νμλ νμ΄ μ‘΄μ¬νμ§ λͺ»νλ μ±μ§μ μ΄μ©νμλ€. μ΄μ μ μ¬νκ² λκ°μ μ νλμ μ§ν©μΌλ‘ λ¬Άμ΄μ μ²λ¦¬νλ€. μ΄ μ§ν©μ cacheλΌλ λ°°μ΄λ‘ 2N - 1κ°μ λκ°μ μ΄ μ‘΄μ¬νλ―λ‘ ν¬κΈ°λ 2N - 1μΌλ‘ μ€μ , μ μ₯νλ κ°μ ν΄λΉ λκ°μ μ λλ μ μ Xμ’νλ₯Ό μ μ₯νμλ€. ν΄λΉ λ°©λ²μ μ΄μ©νκ² λλ©΄ κ° λκ°μ μ μ΄λμ λμμ§ κ²°μ νλ κ²κ³Ό κ°κΈ° λλ¬Έμ O(n * (n-1)!)μ μκ° λ³΅μ‘λλ₯Ό κ°μ§κ³ μ€μ λ‘λ κ°μ§μΉκΈ°λ₯Ό ν΅ν΄ λ μ μ κ²½μ°μ μλ₯Ό νμν μ μλ€.
μ΄ λ, νλμ μ§ν©μμ μ μ μμλλ‘ μ ννκΈ° μν κ·μΉμ λ€μκ³Ό κ°λ€. μΌμͺ½ μλ¨λΆν° idx = 0μ΄λΌκ³ νλ©΄,
- idx = 0 : (0,0)
- idx = 1 : (0,1), (1,0)
- idx = 2 : (0,2), (1,1), (2.0)
μ¦ xμ’νλ 0~idxκΉμ§μ λ²μμμ μμ°¨μ μΌλ‘ μ¦κ°νκ³ μ΄ λ yμ’νλ idx - xκ° λλ€. μ¦, (x,idx - x)μ μ’νκ° ν΄λΉ λκ°μ μ μνλ μ μ΄λ€.
μ¬κΈ°μ κ³ λ €ν΄μΌ ν μ μ΄ idxκ° Nμ λμ΄κ°μ κ²½μ°μλ λͺ¨λ μ μ΄ λ€ μνλκ² μλκ² λλ€. μμ κ·Έλ¦Όμμ λ€μ λκ°μ μ μνλ μ μ μμ 곡μμΌλ‘ ꡬν΄λ³΄λ©΄ (0,5), (1,4), (2,3), (3,2), (4,1), (5,0)μ΄μ§λ§ ν΄λΉ λ°°μ΄ λ²μμ ν¬ν¨λμ§ μλ μ λ μ‘΄μ¬νλ€. λ°λΌμ μ΄μ λν μμΈμ²λ¦¬κ° νμνλ€.
λ²μμ λ§μ‘±νκ³ , λμ μ μλ κ²½μ°(νμ¬ μΉΈμ λΉμμ λμ μ μκ³ λ°λ λ°©ν₯ λκ°μ μ λΉμμ΄ μλ κ²½μ°)μλ cache[idx]λ₯Ό xμ’νλ‘ κ°±μ νκ³ λΉμ cntλ₯Ό νλμ© μ¦κ°μμΌ λ€μ idxμ λν κ²μ¬λ₯Ό μννλ€. μ΅μ’ μ μΌλ‘ idxκ° λκ°μ κ°μμ κ°μμ§λ κ²½μ° maxCntλ₯Ό κ°±μ νκ³ λ¦¬ν΄νκ² λλ€.
private static void putBishop(int idx, int cnt) {
if (idx == (2 * N) - 1) {
if (macCnt < cnt) macCnt = cnt;
return;
}
boolean isExist = false;
for (int i = 0; i <= idx; i++) {
if (i >= N || idx - i >= N || map[i][idx - i] == 0 || !isAvailable(i, idx - i, idx)) continue;
cache[idx] = i;
putBishop(idx + 1, cnt + 1);
isExist = true;
}
if (!isExist) {
cache[idx] = -1;
putBishop(idx + 1, cnt);
}
}
μμ μ½λμμ isExistλ ν΄λΉ λκ°μ μ λμ μ μλ μ μ΄ μ‘΄μ¬νλμ§ νλ¨νλ νλκ·Έμ΄λ€. ν΄λΉ λκ°μ μ λμ μ μλ κ²½μ°μλ cntλ κ·Έλλ‘, cache[idx] = -1μ μ μ₯νλ€.
λ€μμΌλ‘ ν΄μΌν μμ μ λ°λ λ°©ν₯ λκ°μ μ λΉμμ΄ μ‘΄μ¬νλμ§ νμΈνλ μμ μ΄λ€. μ΄μ λν κ·μΉμ λ€μκ³Ό κ°μ΄ μ μνλ€.
νμ¬ λκ°μ μ΄ idxλ²μ΄κ³ μ’νκ° (x,y)μΈ κ²½μ°, κ²μ¬λ idx - 2μΈ λκ°μ λΆν° (x-1, y-1)μ κ²μ¬νλ©΄ λλ€. μ¬κΈ°μ cacheμ xμ’νλ₯Ό μ μ₯νκΈ° λλ¬Έμ cache[idx - 2] = x -1μΈμ§λ₯Ό idxκ° 0λ³΄λ€ ν΄ λκΉμ§ λ°λ³΅ν΄μ κ²μ¬νλ©΄ λλ€.
private static boolean isAvailable(int x, int y, int idx) {
while(idx >= 2 && x >= 1 && y >= 1) {
idx -= 2;
x -= 1;
y -= 1;
if (cache[idx] == x) return false;
}
return true;
}
μ΅μ’ μ½λλ λ€μκ³Ό κ°λ€.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Solution1799 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int N, macCnt;
static int[] cache;
static int[][] map;
public static void main(String[] args) throws IOException {
N = Integer.parseInt(br.readLine());
cache = new int[2 * N - 1];
map = new int[N][N];
for (int i = 0; i < N; i++) {
String[] line = br.readLine().split(" ");
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(line[j]);
}
}
putBishop(0, 0);
System.out.println(macCnt);
}
private static void putBishop(int idx, int cnt) {
if (idx == (2 * N) - 1) {
if (macCnt < cnt) macCnt = cnt;
return;
}
boolean isExist = false;
for (int i = 0; i <= idx; i++) {
if (i >= N || idx - i >= N || map[i][idx - i] == 0 || !isAvailable(i, idx - i, idx)) continue;
cache[idx] = i;
putBishop(idx + 1, cnt + 1);
isExist = true;
}
if (!isExist) {
cache[idx] = -1;
putBishop(idx + 1, cnt);
}
}
private static boolean isAvailable(int x, int y, int idx) {
while(idx >= 2 && x >= 1 && y >= 1) {
idx -= 2;
x -= 1;
y -= 1;
if (cache[idx] == x) return false;
}
return true;
}
}
'π Algorithm > π» λ¬Έμ νμ΄' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λ°±μ€] - 2206. λ²½λΆμκ³ μ΄λνκΈ° (0) | 2021.03.24 |
---|---|
[λ°±μ€] - 1277. λ°μ μ μ€μΉ (0) | 2021.03.24 |
[λ°±μ€] 1967. νΈλ¦¬μ μ§λ¦ (0) | 2021.03.06 |
[λ°±μ€] 1987. μνλ²³ (0) | 2021.02.19 |
[λ°±μ€] 3109. λΉ΅μ§ (0) | 2021.02.19 |
λκΈ