λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ”Ž Algorithm/πŸ’» 문제 풀이

[λ°±μ€€] 9663. N-Queens

by Seongpyo Hong 2021. 2. 5.

문제

 

풀이

μ²˜μŒμ—λŠ” μ™„μ „νƒμƒ‰μœΌλ‘œ μ ‘κ·Όν–ˆμ—ˆμ§€λ§Œ μ‹œκ°„μ΄ˆκ³Όλ‘œ μ‹€νŒ¨ν•˜μ˜€λ‹€. κ·Έλž˜μ„œ 경우의 수λ₯Ό 쀄이기 μœ„ν•œ 방법을 κ³ λ―Όν–ˆκ³  λͺ¨λ“  ν–‰/열이 μ•„λ‹Œ μ–΄μ°¨ν”Ό ν•œ ν–‰μ—λŠ” ν•˜λ‚˜μ˜ Queen만 올 수 μžˆλ‹€λŠ” 점을 μ΄μš©ν•΄ μž¬κ·€ν•¨μˆ˜μ˜ 깊이λ₯Ό 쀄일 수 μžˆμ—ˆλ‹€. 

import java.util.Scanner;

public class NQueens {
	static Scanner sc = new Scanner(System.in);  
	static int result = 0;
	static int N = 0;
	static boolean[][] check;
	static int[] dx = {0, 0, -1, 1, 1 ,1 , -1, -1};
	static int[] dy = {-1, 1, 0 ,0, -1, 1 , 1, -1};
	public static void main(String[] args) {
		N = sc.nextInt();
		for (int i = 0; i < N; i++) {
			check = new boolean[N][N];
			check[0][i] = true;
			nqueen(0,i,1);
		}
		System.out.println(result);
	}
	
	private static void nqueen(int x, int y, int cnt) {
		if (cnt == N ) {
			result += 1;
			return;
		}
		
		for (int j = 0; j < check[0].length; j++) {
			if (j == y || !isValid(x+1, j)) continue;
			check[x+1][j] = true;
			nqueen(x+1, j, cnt + 1);
			check[x+1][j] = false;
		}
	}
	
	static boolean isValid(int x, int y) {	
		for (int i = 0; i < 8; i++) {
			int currentX = x;
			int currentY = y;
			while(true) {
				currentX += dx[i];
				currentY += dy[i];
				if (currentX < 0 || currentX >= N || currentY < 0 || currentY >= N) break;
				if (check[currentX][currentY]) {
					return false;
				}
			}
		}
		return true;
	}
}

 

정닡은 λ§žκΈ΄ν•œλ° μˆ˜ν–‰ μ‹œκ°„μ΄ λ„ˆλ¬΄ 였래 κ±Έλ €μ„œ λ‹€λ₯Έ μ‚¬λžŒλ“€μ˜ μ½”λ“œλ₯Ό μ°Έκ³ ν•΄λ΄€λ‹€. λ¨Όμ € 2차원 배열을 μ΄μš©ν•˜μ§€ μ•Šκ³  1차원 배열을 μ‚¬μš©ν•΄μ„œ μΈλ±μŠ€κ°€ ν–‰μœΌλ‘œ 값이 놓은 μ—΄μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λ„λ‘ κ΅¬ν˜„ν–ˆλ‹€λŠ” 점, 그리고 λ‚˜λŠ” 놓을 수 μžˆλŠ” μœ„μΉ˜λ₯Ό μ°ΎκΈ° μœ„ν•΄ delta 배열을 λ§Œλ“€μ–΄μ„œ λͺ¨λ“  λ°©ν–₯에 λŒ€ν•΄ 탐색을 ν–ˆλŠ”λ°, 이λ₯Ό μ΄μš©ν•΄μ„œ 놓을 수 μžˆλŠ”μ§€ νŒλ‹¨ν•˜λŠ” 뢀뢄을 μ΅œμ ν™” ν•œ 뢀뢄이 λ‚˜μ™€ λ‹€λ₯Έ λΆ€λΆ„μ΄μ—ˆλ‹€.

μ΅œμ ν™” ν•΄λ‹΅

import java.util.Scanner;

public class NQueens {
	static Scanner sc = new Scanner(System.in);  
	static int result = 0;
	static int N = 0;
	static int[] row;
	public static void main(String[] args) {
		N = sc.nextInt();
		row = new int[N];
		int depth = 0;
		nqueen(depth);
		System.out.println(result);
	}
	
	private static void nqueen(int depth) {
		if (depth == N) {
			result += 1;
			return;
		}
		
		for (int i = 0; i < N; i++) {
			row[depth] = i;
			if (isValid(depth)) {
				nqueen(depth + 1);	
			}
		}
	}
	
	static boolean isValid(int depth) {	
		for (int i = 0; i < depth; i++) {
			if (row[i] == row[depth]) 
				return false;
			if (Math.abs(row[i] - row[depth]) == Math.abs(i - depth)) 
				return false;
		}
		return true;
	}
}

λŒ“κΈ€