코테/백준

[백준/JAVA] 9663번: N-Queen

imname1am 2023. 8. 22. 21:09
반응형

🔺 문제

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

 

🔺 코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.util.*;
import java.io.*;
 
public class Main {
    static int[] arr; // 각 인덱스가 행을 의미하는 배열
    static int N;
    static int cnt = 0;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        arr = new int[N];
        
        nQueen(0);
        System.out.println(cnt);
    }
    
    // 1. 재귀호출
    private static void nQueen(int depth) { // depth : 행
        if(depth == N) {    // 행을 다 채우면, 카운트를 1 증가시키고 리턴
            cnt++;
            return;
        }
        
        for(int i = 0 ; i < N ; i++) {
            arr[depth] = i; // (depth, i)에 퀸 배치
            
            // 놓을 수 있는 위치일 경우, 재귀호출
            if(isPossible(depth)) {
                nQueen(depth + 1);
            }
            
        }
    }
    
    // 2. 놓을 위치가 다른 퀸으로부터 위협받는지 검사 (열과 대각선에 대해 생각해봐야함)
    private static boolean isPossible(int col) {    // 1차원 배열의 각 인덱스 위치 = '열'
        for(int i = 0 ; i < col ; i++) {
            if(arr[col] == arr[i]) {    // 같은 열에 존재할 경우
                return false;
            }
            else if(Math.abs(col - i) == Math.abs(arr[col] - arr[i])) {    // 대각선 상에 놓인 경우
                return false;
            }
        }
        
        return true;
    }
}
cs
✅ 해결 아이디어
✔ 백트래킹
- , 상하좌우 및 대각선으로 거리 제한 없이 한 방향으로 이동 가능하며,
  이 이동가능한 동선과 겹치지 않는 곳에 또 다른 퀸을 배치해야 함

- 각 행 별로 놓을 수 있는 위치에 있을 때 재귀호출하고, 만약 모두 배치되었다면 count하면서 경우의 수 찾아냄

 

🔍 체스판은 2차원 배열인데 왜 1차원 배열을 사용하는가?

-> arr의 크기가 행의 크기고, 각 인덱스에 있는 값이 열을 의미하게 함.

-> arr[depth] = i : (depth, i)에 퀸 배치

 


🔺 다른 풀이들

- 2차원 배열과 방향을 활용한 풀이

 

백준 9663번 : N-Queen (JAVA) 문제 풀이

www.acmicpc.net/problem/9663 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시

iseunghan.tistory.com

 

[BOJ] 백준 9663번 N-Queen 백트래킹 (Java)

#9663 N-Queen 난이도 : 골드 5 유형 : DP / 백트래킹 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하

loosie.tistory.com

 


💬 느낀 점

체스 규칙을 몰라서.. 퀸이 어느 방향으로 움직일 수 있는지도 잘 몰랐다고 한다...ㅎ

코드 보고 배워서 나중에는 혼자 코드 작성할 수 있게 복습해야겠다!

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

[백준] 9663번 : N-Queen - JAVA [자바]

www.acmicpc.net/problem/9663 9663번: N-Queen N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시

st-lab.tistory.com

 

[백준] 9663번 N-Queen java

코딩테스트 문제풀이 (브루트포스) : 백트랙킹 기법을 활용하여 N*N의 판에서 N개의 퀸을 서로 공격하지 않게 놓는 경우의 수를 출력하는 문제입니다.

velog.io

 

[백준][JAVA알고리즘]9663번 풀이(N-Queen) - 초보도 이해하는 풀이

안녕하세요 인포돈 입니다. 백준 알고리즘 9663번 풀이입니다. * 참고사항 - 개발환경은 eclipse을 기준으로 작성되었습니다. - java언어를 이용하여 문제를 풀이합니다. - 알고리즘 문제는 풀이를 보

infodon.tistory.com

 

반응형