• Home
  • About
    • Jang photo

      Jang

      Jang's blog

    • Learn More
    • Email
    • Facebook
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

(ALGO) 백준 9663번 문제 - N-Queen 문제(C++)

09 Jun 2018

Reading time ~1 minute

9663

Backtracking(가지 치기) 문제로 유명한 N-Queen 문제이다.

Backtracking이란, 간단하게 말해 brute-force(전부 일일히 다 해보는 것)방법을 수행하지만 한정 함수(bounding function)을 이용해 경우의 수를 줄여나가는 방법을 말한다.

아래는 백트래킹에서 Bounding function(아래 코드에선 promising 함수)를 사용해 구현한 것이다. 시간복잡도는 O(N^N)이어야 하지만, 한정 함수에 의해 실제로는 더 빠른 속도로 수행되는 것을 알 수 있다.

#include <iostream>

using namespace std;

int N;
int col[15];
int result = 0;

bool promising(int i)
{
    for(int j=0;j<i;j++)
    {
        // 새로운 퀸과 기존의 퀸이 같은 행에 있거나 대각선에 있을 경우
        if(col[j] == col[i] || abs(col[i]-col[j]) == (i-j))
            return false;
    }
    return true;
}
void N_Queen(int i)
{
    if(i == N)
        result += 1;
    else
    {
        for(int j=0;j<N;j++)
        {
            col[i] = j;
            if(promising(i))
                N_Queen(i+1);
        }
    }
}

int main()
{
    cin>>N;

    N_Queen(0);

    cout<<result<<endl;

    return 0;
}


algorithm Share Tweet +1