[프로그래머스] N-Queen JavaScript DFS

0

Problem Solving

목록 보기
36/49
post-thumbnail

https://school.programmers.co.kr/learn/courses/30/lessons/12952

풀이 방법

  1. 위에서부터 한줄씩 내려오면서 한 자리씩 Queen을 놓아봄.
  2. 내가 가지고 있는 퀸이 담긴 어레이를 보면서 조건이 맞는지 검사 한다.
    2-1. y와 i가 같다면 같은 열, depth와 x가 같다면 같은 행이다.
    2-2. x-depth, y-i의 절대값이 같다면 대각선이다.
  3. 위 조건에 한번이라도 걸렸다면 false, 조건이 통과하면 해당 좌표를 넣고 재귀호출함.
  4. 재귀 호출이 끝까지 되었거나 조건이 맞지않아 for문이 다 끝났다면 한 단계씩 되돌아오면서 (백트래킹) 다른자리에 Queen을 놓는다.
  5. arr에 4개가 담기면 해당 경우가 끝난것이므로 answer값을 1올린다.
  6. answer을 리턴한다.
function solution(n) {
    
    let answer = 0;
    
    const dfs = (depth, arr)=>{
        // 종료 조건 
        if(depth === n){
            answer++;
            return;
        }
        // 경우의 수 탐색하기. i는 각 행의 한 칸을 의미한다.
        for(let i=0; i<n; i++){
            let flag = true;
            
            // 좌표 저장했던 리스트에서 하나씩 꺼내 비교
            for(let [x,y] of arr){
                // 같은 행,열 대각선이면 flag를 false로 바꾼다.
                if(y-i === 0 || Math.abs(x-depth) === Math.abs(y-i)){
                    flag = false;
                    break;   
                }
            }
            if(flag) dfs(depth+1,[...arr,[depth,i]]); // 한줄 내려오고 좌표 저장
        }
    }
    dfs(0, []);
    return answer;
}

0개의 댓글