본문 바로가기
온라인 저지/BOJ

[BOJ/Java] 9663 N-Queen

by ahj 2022. 2. 18.
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class BOJ9663 {
	static int n, cnt;
	// 각 row에 해당하는 index, 해당 row, index에 놓일 queen의 col 값을 저장할 cols
	static int[] cols;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		cols = new int[n];
		nQueens(0);
		System.out.println(cnt);
	}

	private static void nQueens(int r) {
		// 기저 조건 끝까지 놓이고 넘어 왔다면 n-queen 만족
		if (r == n) {
			cnt++;
			return;
		}
		// 0~n까지 Queen을 놓는 시도
		for (int i = 0; i < n; i++) {
			// r row, i col에 queen을 놓아보기
			cols[r] = i;
			// 놓아도 된다면
			if (isAvailable(r)) {
				// 다음 nQueens로 넘어가기
				nQueens(r + 1);
			}
		}
	}

	// r을 놓을 수 있을지 판단하기 위한 코드
	private static boolean isAvailable(int r) {
		// 0부터 r까지 놓아도 되는지 확인하기
		for (int i = 0; i < r; i++) {
			// 놓여있는 col값들(i)과 놓으려는 queen(r)의 col값이 같거나
			// 행(row)의 차이갑과 열(col)의 차이값이 같으면 같은 대각선상에 있는 것이므로
			if (cols[r] == cols[i] || r - i == Math.abs(cols[r] - cols[i]))
				// 놓을 수 없는 위치이기에 false 반환
				return false;
		}
		// 겹치는 범위가 없었으므로 놓아도 되는 위치
		return true;
	}

}

백트래킹에서는 boolean을 제발 잘 사용하자. 다시 이해할 것

'온라인 저지 > BOJ' 카테고리의 다른 글

[BOJ/Java] 10163 색종이  (0) 2022.02.20
[BOJ/Java] 14502 연구소  (0) 2022.02.18
[BOJ/Java] 1931 회의실 배정  (0) 2022.02.18
[BOJ/Java] 1987 알파벳  (0) 2022.02.18
[BOJ/Java] 3109 빵집  (0) 2022.02.18

댓글