Algorithm

[프로그래머스] 12952 - N-Queen

코드파고 2024. 9. 4. 21:56

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 파악

N * N의 체스판에서 N개의 퀸을 놓을 수 있는 경우의 수를 리턴

 

어려운 점

시간 초과가 나지 않게 구현하도록 하자.

재귀로 구현하게 될 것 같은데 시간 복잡도가 높아지지 않는 방법을 생각해 내기가 어려웠다.

 

풀이

int 배열을 생성하여

  • index -> column
  • index애 해당하는 값 -> row

로 지정하여 구현하면 일차원 배열로도 구현 가능하다.

n개의 퀸을 필수적으로 놓아야 하므로,

  • column(= queen의 개수)을 높여 가며 퀸의 개수가 N에 도달하는 경우에 경우의 수를 늘려 준다.
    • 이 때, column을 늘려 간다는 뜻은 column-1 에 해당하는 칸까지 무사히 퀸을 놓았다고 볼 수 있다.
  • 현재 column에 row를 변화시키며 체스판에 변화를 주고, column-1까지의 퀸에 당하지 않는 경우 재귀호출하도록 한다

 

코드

static int[] arr;
static int answer;
static int N;

public static int solution(int n) {
    N = n;
    arr = new int[N];
    backTracking(0);
    return answer;
}

public static void backTracking(int depth) {
    if (depth == N) {
        answer++;
        return;
    }
    for (int i = 0; i < N; i++) {
        arr[depth] = i;
        if (available(depth)) {
            backTracking(depth + 1);
        }
    }
}

public static boolean available(int col) {
    for (int i = 0; i < col; i++) {
        if (arr[i] == arr[col] || Math.abs(col - i) == Math.abs(arr[col] - arr[i])) {
            return false;
        }
    }
    return true;
}