출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12952
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
가로와 세로의 길이가 n인 체스판에 서로를 공격할 수 없는 n개의 퀸을 놓을 수 있는 경우의 수를 구하는 문제
퀸은 가로, 세로, 대각선으로 이동할 수 있음 = 공격할 수 있음 -> 가로, 세로, 대각선으로 겹치지 않도록 퀸을 두어야 함
visitedC : 해당 열에 말이 있으면 true, 말이 없으면 false
visitedA : 정비례 그래프 모양의 대각선 방향
visitedB : 반비례 그래프 모양의 대각선 방향
class Solution {
static int cnt;
public int solution(int n) {
int answer = 0;
cnt = 0;
dfs(0, 0, new boolean[n], new boolean[2*n], new boolean[2*n-1], n);
return answer = cnt;
}
public void dfs(int qnum, int r, boolean[] visitedC, boolean[] visitedA, boolean[] visitedB, int n) {
if(qnum == n && r == n) {
cnt++;
return;
}
for(int i=0; i<n; i++) {
if(!visitedC[i] && !visitedA[i-r+n] && !visitedB[i+r]) {
visitedC[i] = true;
visitedA[i-r+n] = true;
visitedB[i+r] = true;
dfs(qnum+1, r+1, visitedC, visitedA, visitedB, n);
visitedC[i] = false;
visitedA[i-r+n] = false;
visitedB[i+r] = false;
}
}
}
}
'알고리즘' 카테고리의 다른 글
[프로그래머스/JAVA] 피보나치 수 (0) | 2024.11.23 |
---|---|
[프로그래머스/JAVA]숫자 카드 나누기 (0) | 2024.11.21 |
[SWEA/JAVA] 2805 농작물 수확 (0) | 2024.11.16 |
[SWEA/JAVA] 4522 세상의 모든 팰린드롬 (1) | 2024.11.15 |
[SWEA/JAVA] 4299. 태혁이의 사랑은 타이밍 (0) | 2024.11.14 |