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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae
DS & Algorithm/baekjoon

[백준] 7562번 나이트의 이동 - JavaScript(NodeJS)

[백준] 7562번 나이트의 이동 - JavaScript(NodeJS)
DS & Algorithm/baekjoon

[백준] 7562번 나이트의 이동 - JavaScript(NodeJS)

2021. 5. 28. 16:05

문제

 

7562번: 나이트의 이동

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수

www.acmicpc.net

 

풀이

I x I 행렬에서, 나이트의 위치에서 목표 위치까지 얼마나 빨리 갈 수 있는지를 구하는 문제이다.
최단경로를 구하면 되므로 BFS를 사용해보자.

나이트가 이동 가능한 위치

 

나이트가 이동 가능한 위치는 그림과 같다.

 

나이트가 동일한 위치를 두 번 방문하는 것은 다른 위치로 이동했다가 다시 돌아온 경우이므로,
이를 방지하기 위해 visit 행렬을 통해서 이전 위치로 되돌아가는 경우를 배제한다.

 

나이트는 총 8방향으로 이동할 수 있으므로, 나이트의 현재 위치를 기준으로 8개 방향의 이동 가능성을 조회하면 된다.

 

const sol = (input) => {
  const N = +input[0];
  let idx = 1; // 입력 처리를 위해 input의 인덱스를 조회하는 변수.
  let result = "";

  function bfs(knight, target, I) {
    const queue = [];
    queue.push(knight);
    const visit = Array.from({ length: I }, () => Array(I).fill(0));
    visit[knight[0]][knight[1]]=1;
    const dx = [-2, -1, 1, 2, 2, 1, -1, -2]; // dx, dy는 나이트가 이동 가능한 좌표.
    const dy = [1, 2, 2, 1, -1, -2, -2, -1];
    while (queue.length) {
      const [x, y] = queue.shift();
      if (x === target[0] && y === target[1]) { // (x,y) 좌표 값이 target에 도달했으면 즉시 종료.
        result += `${visit[x][y] - 1}\n`; // 시작 위치 값을 0이 아닌 1로 설정했으므로, 최종 도착 값에서 1을 빼준다.
        break;
      }
      for (let i = 0; i < 8; i++) {
        const [nx, ny] = [x + dx[i], y + dy[i]];
        if (nx < 0 || ny < 0 || nx >= I || ny >= I) continue;
        if (!visit[nx][ny]) { // 만약 이미 방문을 한 위치라면 조회하지 않는다.
          visit[nx][ny] = visit[x][y] + 1; // visit[x][y]는 (x,y)까지의 최단경로이므로, 1을 더해주면 (nx,ny)까지의 최단경로.
          queue.push([nx, ny]);
        }
      }
    }
  }

  for (let i = 0; i < N; i++) { // N개 테스트 케이스를 순차적으로 테스트한다.
    const I = +input[idx++];
    const knight = input[idx++].split(" ").map((v) => +v);
    const target = input[idx++].split(" ").map((v) => +v);
    bfs(knight, target, I);
  }
  return result;
};

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

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

[백준] 16947번 서울 지하철 2호선 - JavaScript(NodeJS)  (0) 2021.05.29
[백준] 16929번 Two Dots - JavaScript(NodeJS)  (0) 2021.05.29
[백준] 7576번 토마토 - JavaScript(NodeJS)  (0) 2021.05.28
[백준] 2178번 미로 -JavaScript(NodeJS)  (0) 2021.05.28
[백준] 13023번 ABCDE - JavaScript(NodeJS)  (0) 2021.05.27
  • 문제
  •  
  • 풀이
'DS & Algorithm/baekjoon' 카테고리의 다른 글
  • [백준] 16947번 서울 지하철 2호선 - JavaScript(NodeJS)
  • [백준] 16929번 Two Dots - JavaScript(NodeJS)
  • [백준] 7576번 토마토 - JavaScript(NodeJS)
  • [백준] 2178번 미로 -JavaScript(NodeJS)
jiho_bae
jiho_bae
하루에 한 걸음씩

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.