Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- CJ DBASE&
- 프로그래머스
- 백트래킹
- 디베이스앤 인턴 후기
- BFS
- IT 면접 준비
- SQL
- ansi sql 단점
- 위상정렬
- ansi sql 장점
- 면접 필수 질문
- 그리디
- 프로그래머스 이중우선순위큐 자바
- 이중우선순위큐 자바
- 이중우선순위큐 java
- DBASE&
- 디베이스앤
- DP
- Java
- oracle ansi
- 백준
- oracle ansi sql
- Gradle
- DFS
- 프로그래머스 이중우선순위큐 java
- 이분탐색
- JPA
- Spring Boot
- 프로그래머스 이중우선순위큐
- 개발자 면접 준비
Archives
- Today
- Total
쉬운 프로그래밍
[알고리즘] 백준 9663 N-Queen 본문
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BOJ_9663 {
static int n;
static int[] map;
static int count = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
n = Integer.parseInt(s);
map = new int[n + 1];
dfs(1);
System.out.println(count);
}
static void dfs(int depth) {
if (depth == n + 1) {
count++;
return;
}
for (int i = 1; i < n + 1; i++) {
map[depth] = i;
if (checkMap(depth)) {
dfs(depth + 1);
}
}
}
static boolean checkMap(int row) {
for (int i = 1; i < row; i++) {
if(map[row] == map[i])
return false;
if (Math.abs(i - row) == Math.abs(map[row] - map[i]))
return false;
}
return true;
}
}
아주 유명한 백트래킹 예제이다.
처음에는 2차원배열을 통해서 문제를 해결하려고 했는데 풀리지가 않아서 다른 분들의 소스코드를 참고해서 풀었다.
1차원 배열을 통해서 체스판을 나타내고 문제를 해결했다.
map[x] = y가 있을 때, x는 행의 좌표를 나타내며 y는 열의 좌표를 나타낸다.
문제 조건에서, 각 행마다 퀸은 무조건 하나씩 존재하기에
for (int i = 1; i < n + 1; i++) {
map[depth] = i;
if (checkMap(depth)) {
dfs(depth + 1);
}
}
위와 같이 재귀호출을 할 수 있다. 현재 depth에서 퀸을 놓을 수 있는 자리면 다음 depth로 dfs를 수행한다.
static boolean checkMap(int row) {
for (int i = 1; i < row; i++) {
if(map[row] == map[i])
return false;
if (Math.abs(i - row) == Math.abs(map[row] - map[i]))
return false;
}
return true;
}
위는 현재 위치에 퀸을 둘 수 있는지 판별하는 메소드이다.
1) 퀸이 동일한 칼럼에 있는 경우
map[x] = y 에서 좌표는 x,y 이기 때문에 map[row]와 map[i]를 비교하면 동일한 칼럼에 위치하는지 알 수 있다.
2) 퀸이 대각선에 존재하는 경우
두 좌표의 row값을 서로 뺀것과 column값을 서로 뺀것의 절대값이 같으면 대각선에 위치한 것이다.
위 조건 두개를 비교하여 재귀를 돌림으로써 문제를 해결하였다.
'알고리즘 > 백트래킹' 카테고리의 다른 글
[알고리즘] 백준 14888 연산자 끼워넣기 - JAVA (0) | 2021.02.05 |
---|---|
[알고리즘] 백준 2580 스도쿠 - JAVA (0) | 2021.02.04 |
[알고리즘] 백준 6603 로또 (0) | 2021.01.09 |
[알고리즘] 백준 15652 N과 M (4) (0) | 2021.01.07 |
[알고리즘] 백준 15650 N과 M (2) (0) | 2021.01.06 |
Comments