-
[프로그래머스]N-Queen_Java알고리즘문제풀이/프로그래머스 2021. 8. 7. 14:56
--문제--
https://programmers.co.kr/learn/courses/30/lessons/12952
코딩테스트 연습 - N-Queen
가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다. 예를 들어서 n이 4인경우 다음과 같이 퀸을 배치하면 n개의 퀸은
programmers.co.kr
--문제 접근--
DFS의 대표적인 문제로
재귀적인 생각을 하는데 도움이 되는 문제입니다..
저는 DFS를 돌면서 Queen을 놓을 수 있는지 없는지 확인하면서 만약 놓을 수 있다면 다음 재귀로 들어가서 다 놓았을 시에 +1을 하면서 문제를 풀이하였습니다.
여기서 중요한 것은 대각선에 놓아져 있는지 확인하는 것이었는데
행의 차와 열의 차가 같다면 그것이 대각선이라는 것이었습니다.
O ↑이렇게 행의차 2 O -> 이렇게 열의 차이 2 ->↑ 코드
package Level3; import java.util.Arrays; public class Nqueen { static int Goal,answer; static boolean[][] map; public static void main(String[] args) { System.out.println(solution(4)); } public static int solution(int n) { answer = 0; Goal=n; map=new boolean[n][n]; DFS(0); return answer; } private static void DFS(int idx) { if(idx==Goal) { answer++; for(boolean[] x :map)System.out.println(Arrays.toString(x)); System.out.println(); return; } for(int i=0;i<Goal;i++) { if(check(idx,i)) { map[idx][i]=true;; DFS(idx+1); map[idx][i]=false; } } } private static boolean check(int x, int y) { //세로체크 for(int i=0;i<x;i++) { if(map[i][y])return false; } for(int i=0;i<x;i++) { for(int j=0;j<Goal;j++) { if(i==x&j==y)continue; if(Math.abs(x-i)==Math.abs(y-j)&&map[i][j])return false; } } return true; } }
'알고리즘문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스]경주로건설_Java (0) 2021.11.25 [프로그래머스]합승택시요금_Java (0) 2021.11.25 [프로그래머스]디스크컨트롤_Java (0) 2021.08.07 [프로그래머스]보석쇼핑_Java (0) 2021.08.03 [프로그래머스]리틀프렌즈사천성_Java (0) 2021.08.01