danbibibi
article thumbnail
Published 2023. 2. 16. 12:29
BOJ 9663번: N-Queen 문제 풀이/백준

문제

문제 바로가기> BOJ 9663번: N-Queen

 

9663번: N-Queen

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

www.acmicpc.net

 

풀이

`board[row] = col` 값을 저장하여, 2차원 배열이 아닌 1차원 배열로 문제를 해결할 수 있다.

 

퀸을 놓을 때 가로, 세로, 대각선을 확인해야 하는데,

solution() 함수에서 한 줄에 하나를 놓고,

유망한 경우, 다음 solution을 호출하기 때문에 자동으로 한 row에는 퀸이 하나만 놓인다.

따라서 대각선과 동일한 column에 퀸이 놓여 있는지를 통해 해당 위치가 유망한지 판단해주면 된다.

 

C++

#include<iostream>
#define MAX 16
using namespace std;

int N, ans=0;
int board[MAX];

bool promising(int row) {
	for (int i = 1; i < row; i++) {
		if (board[i] == board[row] || row - i == abs(board[row] - board[i])) return false;
	} return true;
}

void solution(int row) {
	if (row == N+1) {
		ans++;
		return;
	}
	for (int col = 1; col <= N; col++) {
		board[row] = col; // 말을 놓아 봄 
		if (promising(row)) solution(row +1); // 유망한 경우 계속 
	}
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	cin >> N;
	solution(1);
	cout << ans;
}

 

Java

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

public class Main {
	
	static int N, ans=0;
	static int[] board;

	public static void main(String[] args) throws Exception {
//		System.setIn(new FileInputStream("res/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		N = Integer.parseInt(br.readLine());
		board = new int[N+1];
		solution(1);
		System.out.println(ans);
	}

	static void solution(int row) {
		if(row == N+1) {
			ans++;
			return;
		}
		for(int col=1; col<=N; col++) {
			board[row] = col;
			if(promising(row)) solution(row+1);
		}
	}

	static boolean promising(int row) {
		for(int r=1; r<row; r++) {
			if(board[row] == board[r] || row-r == Math.abs(board[row]-board[r])) return false;
		} return true;
	}
}

'문제 풀이 > 백준' 카테고리의 다른 글

BOJ 10597번: 순열장난  (0) 2023.02.17
BOJ 1655번: 가운데를 말해요  (0) 2023.02.16
BOJ 2023번: 신기한 소수  (0) 2023.02.14
BOJ 17472번: 다리 만들기 2  (0) 2023.02.07
BOJ 17478번: 재귀함수가 뭔가요?  (0) 2023.02.06
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로