본문 바로가기
SWE/코테

[SW Expert Academy] 1일차 #2806 N-Queen

by S나라라2 2019. 3. 5.
반응형

하,, 너무 오랜만에 풀어서인지,,, 진짜 사소한거 하나부터 다 걸렸다ㅠㅠ

이래서 공부를 해야합니다... 꾸준히....


진짜 제일 시간 많이 버린 건 노트북 visual studio 에서 풀 때는 1~10 모두 옳은 경우의 수로 잘 나오는데,,,

SW Expert Academy에서 풀면 4가 계속 1이 나왔음



후,,, 삽질,,,


이유는 boundary check안해줘서!

대각선 부분 확인할 때, visual studio에서는 배열의 -1,-2,,,,를 접근하면 알아서 넘어갔는데

SW Expert Academy는 아니니까 ㅠㅠㅠㅠㅠㅠㅠㅠ

멍청이...


 이 부분입니다.....


Boundary check 까먹지맙시다,,,



#include < iostream >
#include < string.h > // malloc
#include < string > // cin>>str

using namespace std;

// N Queen 경우의 수 
int answer;
int sizeArr; 

int arr[10][10];
int visited[10] = { 0, }; // 열 체크

// 대각선 체크 
// _r,_c 에 queen을 놓아도 되면 return 1
int isAvailable(int _r, int _c) { // 대각선 체크
	int row = _r-1, col = _c-1;

	while (row > -1 && col > -1) {
		if (arr[row][col] == 1) {
			return 0;
		}
		row--, col--;
	}

	row = _r-1, col = _c+1;
	while ( (row < sizeArr && row > -1)
		&& col < sizeArr) {
		if (arr[row][col] == 1) {
			return 0;
		}
		row--, col++;
	}

	return 1;
}

void func(int _row) {

	if (_row == sizeArr) {
		answer++;
	}

	for (int c = 0; c < sizeArr; c++) {
		if (visited[c] == 0 && isAvailable(_row,c)==1) { // 열 & 대각선 체크
			
			visited[c] = 1; // 방문
			arr[_row][c] = 1;

			func(_row + 1); // 다음 행
			
			visited[c] = 0;  // 방문 초기화
			arr[_row][c] = 0;
		}	
	}
}

int main(void) {

	int tc;
	cin >> tc;

	for (int i = 1; i <= tc; i++) {
		answer = 0;  // 초기화
		cin >> sizeArr;

		func(0);

		cout << '#' << i << ' ' << answer << endl;
	}
	return 0;

반응형