본문 바로가기
알고리즘/문제 풀이

[백준] 9663 : N-Queen (JAVA)

by 민죠미 2022. 7. 28.
 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

Solution

너무 유명한 알고리즘이라 퀸이 어떻게 움직이는 지도 써져있지 않다..(^^) 퀸은 상하좌우대각선 8방향으로 움직인다.
2차원 배열을 이용해도 되지만, index를 , arr[index]를 으로 하는 1차원 배열로 푸는게 더 간단하다.

위의 경우 arr = { 6, 4, 2, 0, 5, 7, 1, 3} 으로 표기할 수 있다.

import java.util.*;
import java.io.*;

class Solution
{

	static int N;
	static int cnt=0;
	static int[] arr;
	public static boolean check(int L) {
		// 같은 행에 퀸이 있는 지 확인, 대각선에 퀸이 있는 지(행의 차와 열의 차가 같은 지) 확인
		// 확인은 L열 전까지 해야함 (본인을 탐색할 경우 무조건 false)
		for(int i=0;i<L;i++) {
			if(arr[i]==arr[L]) return false;
			if(Math.abs(i-L)==Math.abs(arr[i]-arr[L])) return false;
		}
		return true;
	}
	public static void dfs(int L) {
		if(L==N) {
			cnt++;
		}else {
			for(int i=0;i<N;i++) {
				arr[L]=i;
				if(check(L)) {
					dfs(L+1);
				}
			}
		}
	}
	public static void main(String args[]) throws Exception
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		N=Integer.parseInt(br.readLine());
		arr=new int[N];
		dfs(0);
		
		System.out.print(cnt);
	}
}

dfs 함수 자체는 중복 순열의 형태와 같다.

댓글