import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class B9663 {
static int[] rows = new int[15];
static int answer = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
simulate(0, N);
System.out.println(answer);
}
private static void simulate(int idx, int size) {
if (idx == size) {
answer++;
return;
}
for (int i = 0; i < size; i++) {
rows[idx] = i;
if (isAvailable(idx)) {
simulate(idx + 1, size);
}
}
}
private static boolean isAvailable(int idx) {
for (int i = 0; i < idx; i++) {
if (Math.abs(rows[idx] - rows[i]) == Math.abs(idx - i) || rows[idx] == rows[i]) {
return false;
}
}
return true;
}
}
유명한 문제다. 풀 때마다 느끼는 거지만 조건을 하나씩 따지기 보다 로직을 크게 보는 훈련
이 되는 것 같다.
행 별로 훑으면서 들어갈 위치(열)를 배정하고, 그 자리가 대각선과 세로 줄을 검토해보았을 때 통과라면 계속 진행, 아니라면 멈추는 방법의 생각보다 간단한 방법이다.
**근데 신기한 점을 발견했다.
같은 코드를 c++, Java
로 작성했을 때는 통과, 파이썬
으로 작성했을 때는 시간초과 실패가 나왔다.
그만큼 파이썬이 시간에 있어 취약하다는 것이겠다...
// Java: 14556 KB | 5428 ms
// C++: 2020 KB | 5116 ms
// Python: 시간초과...