코테/프로그래머스

[프로그래머스/Lv. 2] N-Queen (JAVA)

imname1am 2024. 1. 24. 17:29
반응형

📖 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

💡  풀이 방식

• 백트래킹

필요 자료구조
- 1차원 int형 배열 (퀸의 위치 나타냄) ⭐
- 갯수 저장할 1차원 int형 변수
arr[i] = j : (i, j) 위치에 퀸을 둔다는 의미의 배열

- 퀸, 상하좌우 및 대각선으로 거리 제한 없이 한 방향으로 이동 가능하며,  이 이동가능한 동선과 겹치지 않는 곳에 또 다른 퀸을 배치해야 함

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

  > 놓을 수 있는 위치인지 확인

      → 1) 같은 열에 존재하는지 확인하기

      → 2) 같은 대각선 상에 존재하는지 확인하기

 

 

 

🔺 코드

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
import java.util.*;
 
class Solution {
    static int n;
    static int answer = 0;
    static int[] arr;   // arr[i] = j : (i,j)에 퀸을 둔다는 의미의 배열
    
    public int solution(int n) {
        this.n = n;
        arr = new int[n];
        
        nQueen(0);        
        return answer;
    }
    
    private static void nQueen(int row) {
        if (row == n) { // 행 다 채우면, 정답 +1하고 리턴
            answer++;
            return;
        }
                
        for (int i = 0; i < n; i++) {
            arr[row] = i;   // 🔔 (row, i) 위치에 퀸 둔다는 의미
            
            if(isValid(row)) {   // 놓을 수 있는 위치라면, 재귀 호출
                nQueen(row + 1);
            }
        }
    }
    
    // 놓을 수 있는 위치인지 판별하는 함수 (→ 열, 대각선 확인)
    private static boolean isValid(int col) {
        for(int i = 0 ; i < col ; i++) {
            if(arr[col] == arr[i])  // 1) 같은 열에 존재하면 안 됨
                return false;
 
            if(Math.abs(col - i) == Math.abs(arr[col] - arr[i]))    // 2) 같은 대각선 상에 놓이면 안 됨
                return false;
        }
        
        return true;
    }
}
 
cs

 

 

 

➕ 다른 풀이 방식

- 깔끔한 설명!

 

프로그래머스 - N Queen(Java)

백트랙킹 문제입니다. N이 주어질 때, 크기가 N*N인 이차원 배열에서 N개의 퀸이 놓여질 수 있는 경우의 수를 구하는 문제입니다. 퀸은 다음과 같은 특징을 지니고 있습니다. 하나의 퀸이 놓여진

ksb-dev.tistory.com

 

 

[프로그래머스 , 자바] Level2: N-Queen

문제분석: 길이가 N인 보드판에 N개의 퀸말을 서로 공격할수없는 상태로 만드는 형태의 갯수를 구하는문제다. 이 문제를 처음 접근할때 대부분의 사람들은 2차원 배열을 만들고 완전탐색을 진행

taehoung0102.tistory.com


💦 어려웠던 점

- 1차원 배열의 의미를 제대로 파악하지 못 하였다..

 

 

🧐 새로 알게 된 내용

2차원 배열을 1차원 배열로 압축시키기

- 배열의 idx를 행, 배열의 값을 열로 보기

 

 

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

(참고)

 

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

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

bono039.tistory.com

 

반응형