Java

[백준 9663] N-Queen 풀이 (JAVA)

iheeeee6-6 2023. 2. 2. 11:50
728x90

https://www.acmicpc.net/problem/9663

 

9663번: N-Queen

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

www.acmicpc.net


이 문제는 backtracking 의 대표적인 문제이다.
익숙하지 않은 기법이기에 문제 풀이하는데에 시간이 많이 소요되었다.

체스판에서 퀸은 가로 세로 대각선으로 무제한 이동 가능하다는 특징이 있다.
따라서 하나의 행에는 단 하나의 퀸만 놓을 수 있다!!
이 점을 토대로 일차원배열을 생성하여 'arr[행] = 열' 로 확인해나가는 것이 핵심이다!!!!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main { 
	static int n, count; //경우의 수 카운트 값
	static int[] arr; //체스판

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		arr = new int[n]; // 행을 뜻함
		backtracking(0);  //0행 부터 시작!
		System.out.println(count);
	}

	static void backtracking(int row) {
		if (row == n) { //n번째 행은 마지막으로 수행되는 곳이기에 놓을 수 있는 위치는 단 하나이기에 return!
			count++;
			return;
		}
		for (int i = 0; i < n; i++) { //열을 뜻함 
			arr[row] = i; // row행의 i번째 열에 퀀을 놓은다면..? 을 뜻함
			if (isGood(row, i)) { //퀸 자리로써 알맞은지 체크!
				backtracking(row + 1); //다음 행의 퀸 자리 확인하러 가기
			}
		}

	}

	static boolean isGood(int r, int c) {
		for (int k = 0; k < r ; k++) {
			if (c == arr[k] || Math.abs(r - k) == Math.abs(c - arr[k])) {
            	//같은 열이면 탈락, 행-행과 열-열의 차이가 같으면 대각선 위치이기에 탈락
				return false;
			}
		}
		return true;
	}

}

 

'Java' 카테고리의 다른 글

[백준 1439] 뒤집기 (JAVA)  (0) 2023.02.04
[백준 1202] 보석도둑 (JAVA)  (0) 2023.02.03
[백준 7576] 토마토 풀이 (JAVA)  (0) 2023.02.03
[백준 14888] 연산자 끼워넣기 (JAVA)  (0) 2023.02.02
[java] 코테 준비 1 - Stack 클래스  (0) 2022.10.01