N Queens
Updated:
전형적인 n queen 문제이다
1차원배열을 이용해서 2차원 좌표를 저장할수있다.
1차원의 인덱스는 행, 1차원 인덱스의 value값을 열값이라고 칭하면 된다.
그럼 Recursion을 이용하여 각 행마다 퀸을 계속놓는다고 가정할때, 더이상 끝을 놓을수 없을때 그때 답이 된다는 것을 알고있다.
그러면, 각 행마다 열의 위치를 놓아줘야 하는데, 이 경우의수를 다하게되면 시간초과가 난다
그래서 백트래킹을 이용해서 가지치기를 해줘야 한다.
안되는 조건은 2가지를 보면된다.
- 열의 좌표가 같은경우(어차피 행은 애초에 다른 행이니까 , 상관이 없다)
- 대각선을 그었을때 퀸에게 잡히는 경우(현재 새로운위치의(x,y)와 이전 퀸들의 위치(a,b)라고 할때, 절대값 (x-a)와 (y-b)가 일치하는경우)
이 2가지 조건을 빼면 N queen을 만족할수 있다.
그때 만족하는 퀸 모양의 형태를 List
by Java
class Solution {
    public List<List<String>> solveNQueens(int n) {
        int[] arr = new int[n];
        List<List<String>> ans = new ArrayList<>();
        go(0,n,arr,ans);
        return ans;
    }
    private void go(int index,int depth,int[] arr,List<List<String>> ans) {
        if(index==depth) {
            char[][] board = new char[depth][depth];
            for(int i=0;i<depth;i++) {
                for(int j=0;j<depth;j++) {
                    board[i][j]='.';
                }
            }
            for(int i=0;i<arr.length;i++) {
                board[i][arr[i]-1]='Q';
            }
            List<String> temp = new ArrayList<>();
            for(int i=0;i<depth;i++) {
                StringBuilder sb = new StringBuilder();
                for(int j=0;j<depth;j++) {
                    sb.append(board[i][j]);
                }
                temp.add(sb.toString());
            }
            ans.add(temp);
            return;
        }
        for(int i=1;i<=depth;i++) {
            arr[index] = i;
            if(check(index,arr)) {
                go(index+1,depth,arr,ans);
            }
            else arr[index]=0;
        }
        
    }
    private boolean check(int index,int[] arr) {
        for(int i=0;i<index;i++) {
            if(arr[i]==arr[index] || Math.abs(i-index)==Math.abs(arr[i]-arr[index])) return false;
        }
        return true;
    }
}
 
      
    
Leave a comment