알고리즘문제풀이/프로그래머스

[프로그래머스]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;
	}
}