jiho_bae
Go devlog
jiho_bae
전체 방문자
오늘
어제
  • 분류 전체보기 (158)
    • JavaScript (38)
      • theory (34)
      • vanilla (4)
    • HTML & CSS (2)
    • Browser (3)
    • CS (6)
      • linux (1)
      • shell (2)
      • compiler (2)
    • DS & Algorithm (87)
      • theory (5)
      • basic (7)
      • programmers (30)
      • baekjoon (45)
    • Design Pattern (2)
    • Error (4)
    • Git & Github (4)
    • Tools (1)
    • 부트캠프 (4)
    • Small Tips (2)
    • Java (3)
    • test (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자바스크립트 이벤트 위임
  • 병합정렬 자바스크립트
  • 덧칠하기 javascript
  • JavaScript
  • 계수정렬 자바스크립트
  • 깃 이전 커밋에서 새 브랜치 만들기
  • 대충만든자판 javascript
  • 가사 검색 자바스크립트
  • 자바스크립트 모듈 시스템
  • safari invalid date error
  • 퀵정렬 자바스크립트
  • 자바스크립트 채팅방 스크롤
  • 프로그래머스 숫자카드나누기 javascript
  • fetch 취소하기
  • 자바스크립트 sort는 왜 그모양일까
  • 자바스크립트 커링
  • 자바스크립트 배열의 특수함
  • 자바스크립트 비동기 마이크로 태스크 큐와 렌더링 과정
  • 1753 최단경로 javascript
  • 13460 javascript nodejs
  • 25632 소수 부르기 게임
  • 백준 17406 nodeJS
  • javascript use strict
  • 외벽 점검 javascript
  • 억억단을 외우자 javascript
  • safari Date format NaN
  • 카카오 코딩테스트 양궁대회 nodeJS
  • 리액트 프로젝트 디버깅하기
  • 백준 자바스크립트 입력 템플릿
  • 리코쳇 로봇 javascript

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae

Go devlog

[백준] 9663번 N-Queen - JavaScript(NodeJS)
DS & Algorithm/baekjoon

[백준] 9663번 N-Queen - JavaScript(NodeJS)

2021. 6. 8. 23:19

문제

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

풀이

가장 중요한 문제의 조건은 퀸의 움직임이다.

 

퀸은 한 번 움직일 때 자기 위치에서 상하좌우+대각선 중 한 방향으로 무한정 이동 가능하다.

따라서 퀸이 서로 공격을 할 수 없는 예시를 그려보면 아래 그림과 같다.

 

이외에도 여러 경우가 있을테니, N이 주어졌을 때 퀸을 놓는 경우의 수를 구하면 된다.

 

풀이 방향

퀸의 움직임을 알고나면 문제가 쉬워진다.

 

N개를 배치해야 하므로 DFS를 이용해 문제를 풀어보자.

 

DFS에서 N x N를 모두 조회할 필요는 없다.

 

퀸은 서로 다른 행과 열에 위치해야 하므로, 행이나 열 중 하나를 기준으로 잡아본다.

크기 N인 배열을 선언하고, 이 배열의 0번 인덱스 값은 0행에서 위치한 퀸의 열번호를 의미한다.

 

예시 그림을 배열로 표현하면, [2, 0, 3, 1] 이다.

 

이렇게 행을 기준으로 했다면
1행에서 퀸이 위치해야 할 열을 정하고, 2행에서 퀸이 위치해야 할 열을 정한다.
성공적으로 N행까지 퀸을 위치시켰다면 카운트를 증가시키면 된다.

 

퀸을 위치시킬 때, 퀸의 특성을 고려해준다.

퀸을 위치시키고자 하는 열에, 이미 다른 행에서 퀸을 위치시켰다면 그 위치는 불가능하며
또한 위치시키고자 하는 열의 대각선에 퀸이 위치해도 불가능함을 고려하면 된다.

 

코드를 보자.

 

코드

const sol = (N) => {
  const row = new Array(N).fill(0);
  let cnt = 0;

  function isPossible(L, X) { // L행 X열에 퀸을 둘 수 있는지 판단하기 위해 0 ~ L-1행까지 상하좌우 + 대각선까지 조회.
    for (let i = 0; i < L; i++) {
      if (X === row[i]) return false;
      if (Math.abs(X - row[i]) === L - i) return false;
    }
    return true;
  }

  function dfs(L) {
    if (L === N) {
      cnt++;
      return;
    }
    for (let i = 0; i < N; i++) {
      if (isPossible(L)) { // L행 i열에 둘 수 있다면 실행.
        row[L]=i;
        dfs(L + 1);
      }
    }
  }

  dfs(0);
  return cnt;
};

// 백준에서 입력을 받는 코드
const input = [];
require("readline")
  .createInterface(process.stdin, process.stdout)
  .on("line", (line) => {
    console.log(sol(+line));
  })
  .on("close", () => {
    process.exit();
  });
저작자표시

'DS & Algorithm > baekjoon' 카테고리의 다른 글

[백준] 15990번 1, 2, 3 더하기 5 - JavaScript(NodeJS)  (0) 2021.06.09
[백준] 1157번 단어 공부 - JavaScript(NodeJS)  (0) 2021.06.09
[백준] 16198번 에너지 모으기 - JavaScript(NodeJS)  (0) 2021.06.08
[백준] 16197번 두 동전 - JavaScript(NodeJS)  (0) 2021.06.07
[백준] 15658번 연산자 끼워넣기(2) - JavaScript(NodeJS)  (0) 2021.06.07
    'DS & Algorithm/baekjoon' 카테고리의 다른 글
    • [백준] 15990번 1, 2, 3 더하기 5 - JavaScript(NodeJS)
    • [백준] 1157번 단어 공부 - JavaScript(NodeJS)
    • [백준] 16198번 에너지 모으기 - JavaScript(NodeJS)
    • [백준] 16197번 두 동전 - JavaScript(NodeJS)
    jiho_bae
    jiho_bae
    하루에 한 걸음씩

    티스토리툴바