Javascript를 배우고 있습니다. 매일 배운 것을 이해한만큼 정리해봅니다.
hasRowConflictAt: function(rowIndex) {
let obj = this.attributes;
let count = 0;
for (let i = 0; i < obj[rowIndex].length; i++) {
count = count + obj[rowIndex][i];
}
return count > 1;
}
hasAnyRowConflicts: function() {
let obj = this.attributes;
for (let key in obj) {
if (this.hasRowConflictAt(key)) {
return true;
}
}
return false;
}
hasColConflictAt: function(colIndex) {
let obj = this.attributes;
let count = 0;
for (let i = 0; i < obj[0].length; i++) {
count = count + obj[i][colIndex];
}
return count > 1
}
hasAnyColConflicts: function() {
let obj = this.attributes;
for (let i = 0; i < obj[0].length; i++) {
if (this.hasColConflictAt(i)) {
return true;
}
}
return false;
}
행, 열 충돌을 확인하는 함수를 완성하고 나면 그 다음 양 대각선에 대한 충돌을 확인하는 함수를 만들어야 한다.
이 때 행, 열과 달리 대각선은 검사의 시작점이 상이하다. 가장 작은 대각선부터 체스판 내 모든 대각선을 검사해야 하므로 아래와 같은 방법으로 시작점을 체스판 바깥에서부터 시작하는 방법을 선택했다.
처음엔 헷갈려서 이렇게 그림을 그려보니 좀 더 명확해졌다. (파란색은 major, 빨간색은 minor diagonal)
major diagonal conflict 체크
hasMajorDiagonalConflictAt: function(colIdx) {
let obj = this.attributes;
let count = 0;
for (let i = 0; i < obj[0].length && colIdx < obj[0].length; i++, colIdx++) {
if (obj[i][colIdx] === 1) {
count++;
}
}
return count > 1
}
hasAnyMajorDiagonalConflicts: function() {
let obj = this.attributes;
if (Object.keys(obj).length === 0) {
return false;
}
let n = obj[0].length;
for (let colIdx = -(n - 1); colIdx < n + (n - 1); colIdx++) {
if (this.hasMajorDiagonalConflictAt(colIdx)) {
return true;
}
}
return false;
}
hasMinorDiagonalConflictAt: function(colIdx) {
let obj = this.attributes;
let count = 0;
let n = obj[0].length;
for (let i = n - 1; i >= 0 && colIdx < n; i--, colIdx++) {
if (obj[i][colIdx] === 1) {
count++;
}
}
return count > 1
}
hasAnyMinorDiagonalConflicts: function() {
let obj = this.attributes;
if (Object.keys(obj).length === 0) {
return false;
}
let n = obj[0].length;
for (let colIdx = -(n - 1); colIdx < n + (n - 1); colIdx++) {
if (this.hasMinorDiagonalConflictAt(colIdx)) {
return true;
}
}
return false;
}
주어진 시간 내에 count N Rooks Solution부터 풀질 못했다...ㅜㅜ
나중을 위해 의사코드라도 남겨본다...
window.findNRooksSolution = function(n) {
var solution = new Board({ n: n });
for (let i = 0; i < solution.attributes["n"]; i++) {
solution.togglePiece(i, i);
}
console.log("Single solution for " + n + " rooks:", JSON.stringify(solution));
return solution.rows();
};
/* row : 0~4 , col: 0~4
row: 0~4, col: 1~4
row: 0~4. col: 2~4
row:0~4, col: 3~4 -> 검사할 것이 없다. 재귀 끝(탈출 조건)
재귀용 카운트 = 0
for(row : ~ n까지)
for(col: ~ n까지)
토글 처리 먼저
충돌검사
충돌이다 -> 토클처리 한번 더
아니면 -> 재귀용 카운드 1 올리고, 기준을 바꿔서 재귀
재귀가 다 끝나면
재귀용 카운트가 n-1번 호출되면 인지 검사해서 솔루션 카운트를 1 올림
재귀용 카운트는 0으로 초기화
다시 row를 1올려서 다시 재귀*/
이미지 출처: https://daisyleetcode2014.wordpress.com/2014/05/12/n-queens%E8%A7%A3%E6%B3%95-dfs/
안녕하세요 선배님. 같은 코드스테이츠 후배입니다. 선배님 코드를 참조를 하고 있었는데 hasMajorDiagonalConflictAt 에서 for loop 조건에 idx는 혹시 colIdx 아닌가요??