일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 플로이드-워셜 알고리즘
- 영속성 컨텍스트
- java
- javascript
- OS
- CS
- CSS
- 완전탐색
- 아키텍처
- Data structure
- DFS
- deque
- PYTHON
- 자료구조
- BFS
- 운영체제
- 알고리즘
- Algorithm
- HTML
- 프로그래머스
- db
- 레디스
- 데이터베이스
- 캐싱
- nosql
- It
- jpa
- redis
- 백준
- Dijkstra
- Today
- Total
If at first you don't succeed, try again
[알고리즘] 백준 9663번 - N-Queen(Java) 본문
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
문제
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.
N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (1 ≤ N < 15)
출력
첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.
예제 입력 1 복사
8
예제 출력 1 복사
92
* 풀이
N-Queen 문제는 가장 대표적인 백트래킹 문제다. 해당 문제를 풀기 위해서는 먼저 3가지 과정을 살펴보아야 한다.
1. 1차원 배열을 생성한다.(배열의 index는 열에 해당함. 배열의 value는 행에 해당함.) dfs를 하며 백트래킹 진행
- ex) {3} -> index : 0, value : 3 -> 3행 0열
2. 열 단위로 반복문을 진행하는데, 퀸을 놓을 수 있는 자리인지 확인한다.(isPossible 메서드) 확인하여 퀸을 놓을 수 있는 자리라면 true를 반환하고, 퀸을 놓을 수 없는 자리라면(같은 행인 경우, 대각선 위치에 있는 경우) false를 반환한다.
* 같은 행인 것을 확인하는 방법 : i열(index)만큼 반복 -> chessArray[column] == chessArray[i] 이라면(i열 행과 column열의 행과 같다면 -> value가 행이므로) 같은 행에 존재한다.
* 대각선 위치에 있는 것을 확인하는 방법 : (index의 값 - index의 값) == (value의 값 - value의 값) 이라면 대각선 위치에 존재한다.
3. 퀸을 놓을 수 있는 자리라면 column을 1씩 증가시켜 dfs를 진행한다. column이 최대 크기 n과 같아진다면 경우의 수인 count를 증가시킨다.
다음은 풀이 코드이다.
import java.util.*;
public class Main {
static int count = 0;
static int[] chessArray;
public static void dfs(int column, int n) {
if(column == n) {
count++;
return;
}
for(int i = 0; i < n; i++) {
chessArray[column] = i;
if(isPossible(column)) {
dfs(column + 1, n);
}
}
}
public static boolean isPossible(int column) {
for(int i = 0; i < column; i++) {
if(chessArray[column] == chessArray[i])
return false;
else if(Math.abs(column - i) == Math.abs(chessArray[column] - chessArray[i]))
return false;
}
return true;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
chessArray = new int[n];
dfs(0, n);
System.out.println(count);
}
}
'Computer Science > 알고리즘(Java)' 카테고리의 다른 글
[알고리즘] 프로그래머스 - 기사단원의 무기(java) (0) | 2023.02.18 |
---|---|
[알고리즘] 백준 1072번 - 게임(Java) (0) | 2023.02.18 |
[알고리즘] 백준 9095번 - 1, 2, 3 더하기(Java) (0) | 2023.01.12 |
[알고리즘] 프로그래머스 - k진수에서 소수 구하기(Java) (0) | 2023.01.11 |
[알고리즘] 프로그래머스 - 이중우선순위큐(Java) (0) | 2022.12.23 |