36일차 (01-27-2021)

조상래·2021년 1월 27일
0

코드스테이츠

목록 보기
34/73

NQueen 해답이 나오지 않아 고민하다, 친구에게 코드 점검을 부탁했다. 처음 내가 쓴 코드는

findQueensSolution = function (n) {
  const solution = new Board({n: n}); // fixme
  let pieces = n
  let findSolution = function (rowIdx, restPieces) {
    if (restPieces === 0) {
      return true;
    } else {
      for (let i = 0; i < pieces; i += 1) {
        solution.togglePiece(rowIdx, i);
        if (!solution.hasQueensConflictson(rowIdx, i) && rowIdx < pieces) {
          let result = findSolution(rowIdx + 1, restPieces - 1);
          if(result) return true;
        }
        solution.togglePiece(rowIdx, i);
      }
    }
  }

  findSolution(0, n)

  return solution.rows();
};

위와 같이 토글을 하고 토글한 자리가 충돌이 있는 자리인지 아닌지를 구별하여 재귀를 실행하거나 재토글을 하거나 하는 것이었다. 이렇게 했을 땐 솔루션이 제대로 나오지 않았고 심지어 말도 안되는 솔루션들이 튀어 나왔다. 친구가 내 코드를 보고 의견을 냈는데 충돌 여부를 보드 전체를 보는게 어떠냐는 것이었고, 나는 그 메소드를 가져와 적용하여 확인해보니 제대로 작동 하였다.

findQueensSolution = function (n) {
  const solution = new Board({n: n}); // fixme
  let pieces = n
  let findSolution = function (rowIdx, restPieces) {
    if (restPieces === 0) {
      return true;
    } else {
      for (let i = 0; i < pieces; i += 1) {
        solution.togglePiece(rowIdx, i);
        if (!solution.hasQueensConflicts() && rowIdx < pieces) { // 이부분
          let result = findSolution(rowIdx + 1, restPieces - 1);
          if(result) return true;
        }
        solution.togglePiece(rowIdx, i);
      }
    }
  }

  findSolution(0, n)

  return solution.rows();
};

근데 난 아직도 왜 위 코드는 안되고 밑 코드는 되지는 모르겠다... 그리고 먼저 내 코드가 전체적으로 깔끔하지 못하고 최적화가 되어 있지 않다. 그래서 연산 시간도 굉장히 오래 걸리고 내가 인지를 못한 오류가 있지 않았을까 라는 생각을 한다.


오늘은 HA가 있는 날이다. 우리가 IM에서 배웠던 몇가지를 간단하게 문제로 만들어 내주었는데 코드스테이츠의 이런 시스템이 너무너무 좋다! 특히 KOANS나 이번 HA 같은 경우는 키워드의 사용법의 디테일한 부분까지 물어 본다. 그래서 내가 놓치고 있는 부족한 부분을 캐치할 수 있고 나의 공부에 대한 방향성을 잡을 수 있게 되었다. 이번 HA는 평가를 하는게 하닌 셀프체크 용도로 스케줄 되었다고 하였다. 그래서 그런지 난이도는 그렇게 높지는 않았다. 내일 부턴 솔로 스터디가 있는데 그 동안 시간이 없어서 깊게 공부 하지 못했던 것을 하나하나씩 해나가야겠다.

profile
Codestates Full IM26기 수료

0개의 댓글