반응형
Notice
Recent Posts
Recent Comments
Link
It's easy, if you try
[백준/boj] 9663: N-Queen (Java) / 백트래킹 본문
반응형
문제
풀이
import java.io.*;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int N;
static int[] col;
static int answer = 0;
public static void main(String[] args) throws NumberFormatException, IOException {
N = Integer.parseInt(br.readLine());
col = new int[N+1]; // 퀸이 놓이는 열 (size: 행의 수)
setQueen(0);
System.out.println(answer);
}
private static void setQueen(int row) {
if(!isValid(row)) { // 유효하지 않은 경우, return(백트래킹, 가지제거)
return;
}
if(row == N) { // 모든 행에 퀸을 둔 경우
answer++; // 답 증가
return;
}
for(int i=1; i<=N; i++) { // 1 열 N 열까지
col[row+1] = i; // row가 0일 때, 1행의 1열에 퀸을 위치하는 경우의 수부터 N열에 위치하는 경우의 수까지,
setQueen(row+1); // 행 + 1 (가지를 늘려나간다.)
}
}
private static boolean isValid(int row) {
for(int i=1; i< row; i++) { // 1행부터 row -1행까지 (row 이전 행에 이미 퀸을 위치시킨 상태)
// 같은 열에 퀸이 존재하거나 || 대각선(열의 차이의 절댓값 == 행의 차이)에 위치한 경우 false return
if(col[row] == col[i] || Math.abs(col[row]-col[i]) == row-i) return false;
}
return true;
}
}
퀸이 위협하는 자리는 같은 행, 같은 열, 대각선 위치 이다.
같은 행에는 놓을 수 없기 때문에 1차열 배열(col[row]) 을 사용했다. 행(row)에 놓이는 퀸의 열(col) 값을 담는다.
퀸을 놓는 경우의 수는 대표적인 백트래킹의 예제이다.
백트래킹은 경우의 수 가지들이 뻗어나갈 때, 유망하지 않은 가지들은 제거하면서 전체 탐색을 하는 것으로, 재귀가 많이 쓰인다.
이 예제에서 가지를 제거하는 조건은, 같은 열에 퀸이 존재하거나, 대각선에 위치한 경우이다.
반응형
'알고리즘 > 자바(Java)' 카테고리의 다른 글
[SW Expert Academy] 7964: 부먹왕국의 차원 관문 (Java) (0) | 2021.02.25 |
---|---|
[SW Expert Academy] 4789: 성공적인 공연 기획 (Java) (0) | 2021.02.25 |
[백준/boj] 20055: 컨베이어 벨트 위의 로봇 (Java) / 구현 / 시뮬레이션 (0) | 2021.02.23 |
[백준/boj] 2331: 반복수열 (Java) / 구현 (0) | 2021.02.23 |
[백준/boj] 1629: 곱셈 (Java) / 분할정복 (0) | 2021.02.21 |
Comments