The value of the local variable n is not used 해결법
- 백준 9663 N-Queen https://www.acmicpc.net/problem/9663
package backTracking;
import java.util.Scanner;
public class backjoonNQueen {
// 이렇게 하는 이유는 메서드 세개 모두에서 사용가능하게 하려고
static int n;
static int[] arr; // arr[i] = i번째 행에서 퀸이 놓인 열 위치
static int answer = 0; // 해답 개수
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 체스판 크기, Queen의 개수
// arr[i] = j는 i번째 행(row)의 퀸이 j번째 열(column)에 있다는 의미
// arr 배열의 인덱스는 행, 값은 열
int[] arr = new int[n];
dfs(0); // 0번째 행부터 시작
sc.close();
System.out.println(answer);
}
static void dfs(int row) {
// n은 체스판 크기이자 퀸 개수
// 즉, 0 ~ n-1행까지 퀸을 다 놓았을 때
// row == n 이면 row == 4이까 0~3행에 퀸을 다 놓은 상태
// 이 시점에서 더 이상 행을 내려가서 퀸을 놓을 필요가 없음
// 따라서 return; 으로 현재 DFS 호출 종료 → 이전 행으로 돌아감
if (row == n) { // row == n → 모든 행에 퀸을 놓았다 → 해답 1개 완성 ★
answer++;
return; // 이전 행으로 돌아감 ★
}
for (int col = 0; col < n; col++) {
arr[row] = col; // row행 col열에 퀸 노힉
if (isPossible(row)) { // 지금까지 놓은 퀸들이 서로 공격하지 않으면
dfs(row + 1); // 다음 행으로 이동
}
}
}
private static boolean isPossible(int row) {
for (int i = 0; i < row; i++) {
// 같은 열에 이미 퀸이 있으면 실패
// 여기서 arr[i]는 이미 놓은 퀸들의 열 위치(과거 기록)
// arr[row]는 지금 새로 놓으려는 퀸의 열 위치(현재 진행)
if (arr[i] == arr[row]) return false;
// 대각선에 퀸이 있으면 실패
if (Math.abs(row - i) == Math.abs(arr[row] - arr[i])) return false;
}
return true;
}
}
The value of the local variable n is not used
The value of the local variable arr is not used
이미 전역 영역에 변수 선언을 했는데 main에서도 중복 선언해서 에러가 난 것이다.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 체스판 크기, Queen의 개수
// arr[i] = j는 i번째 행(row)의 퀸이 j번째 열(column)에 있다는 의미
// arr 배열의 인덱스는 행, 값은 열
int[] arr = new int[n];
dfs(0); // 0번째 행부터 시작
sc.close();
System.out.println(answer);
}
자료형을 떼고 변수명만 쓰는 방법으로 수정했다.
n = sc.nextInt(); // 체스판 크기, Queen의 개수
arr = new int[n];
만약 전역 영역을 최소화 할거면 전역 변수 arr을 없애고, main의 arr을 dfs에 매개변수로 전달하는 방법도 있다고 한다.
static void dfs(int row, int[] arr) {
if (row == n) {
answer++;
return;
}
for (int col = 0; col < n; col++) {
arr[row] = col;
if (isPossible(row, arr)) {
dfs(row + 1, arr);
}
}
}
private static boolean isPossible(int row, int[] arr) {
for (int i = 0; i < row; i++) {
if (arr[i] == arr[row]) return false;
if (Math.abs(row - i) == Math.abs(arr[row] - arr[i])) return false;
}
return true;
}