백트래킹을 사용했다.
우선 다시 푸는 문제이기에 행, 열에 어떻게 접근해줘야 하는지는 이전에 remind 한 것으로 잘 알고 있었다. 하지만 두 가지에서 막혔는데,
dfs를 다시 실행할 떄의 조건과
대각선 체크를 어떻게 해주는지에 대해서다.
두 방법의 solution 을 찾기 위해서 다른 사람의 풀이는 아니고 내가 전에 제출했던 코드를 다시 살펴 봤다. (이전에 제출한 것이 다른 사람의 풀이를 참고한 코드이니 사실상 다를 것은 없다.)
20분 정도 보고 2가지를 해결하지 못해서 풀이를 참고 했고, 10분 동안 다시 이해를 하고 문제를 풀었다.
import java.io.*;
import java.util.*;
public class Main {
static int map[];
static int count=0;
static StringBuilder sb=new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n=Integer.parseInt(br.readLine());
map=new int[n];
dfs(0);
System.out.println(count);
}
public static void dfs(int depth) {
if(depth==map.length) {
count++;
return;
}
for(int i=0;i<map.length;i++) {
map[depth]=i;
if(check(depth)) {
dfs(depth+1);
}
}
}
public static boolean check(int row) {
for(int i=0;i<row;i++) {
if(map[i]==map[row]) return false;
if(Math.abs(i-row)==Math.abs(map[i]-map[row])) return false;
}
return true;
}
}
19일만에 다시푸는 데 꽤 막혔다.
이 문제는 조만간 다시 풀어봐야겠다. 그리고 이것과 비슷한 문제로 스도쿠 문제가 있던데 그것도 풀어볼 예정이다.
하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212