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)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae

Go devlog

DS & Algorithm/baekjoon

[백준] 1261번 알고스팟 - JavaScript(NodeJS)

2021. 6. 1. 05:29

문제

 

1261번: 알고스팟

첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미

www.acmicpc.net

 

풀이

N x M 크기 미로에서 (1,1)에서 시작하여 (N,M)에 도달하면 끝난다.

 

미로에서는 벽이 없다면 바로 이동하며, 벽이 있다면 부수고 이동할 수 있다.
(N,M)에 도달하기까지 벽을 최소 몇 개 부수고 이동할 수 있는지를 구하면 된다.

이동은 상하좌우로 총 4방향이 가능하다.

 

풀이 방향

13549 숨바꼭질3 문제와 유사한데, 작업의 우선순위를 설정해야 한다.

 

즉, 목적지에 도착하기까지 벽을 최대한 부수지 말아야 하므로, 벽을 부수지 않는 이동에 우선순위를 준다.

 

BFS를 사용하는 것은 같다.

Deque 자료구조를 사용해서, 매 스텝마다 벽을 부수지 않는 이동을 우선적으로 처리한다.

 

벽을 부수지 않는 이동이 우선적으로 처리되므로

미로의 크기만큼 방문 배열을 추가로 선언해서, 동일한 위치로 이동하는 중복된 경우를 방지한다.

 

※ 입력이 주어질 때, N M 순서가 아닌 M N 순서로 주어짐에 유의한다.

 

코드

const sol = (input) => {
  const [M, N] = input[0].split(" ").map(Number); // M,N 순서로 데이터가 주어진다.
  input = input.slice(1);
  const adjM = input.map((row) => row.split("").map(Number));

  function bfs(sx, sy) {
    const deque = [];
    deque.push([sx, sy, 0]);
    const check = Array.from({ length: N }, () => new Array(M).fill(0));
    check[sx][sy] = 1;
    const dx = [-1, 0, 1, 0];
    const dy = [0, 1, 0, -1];
    while (deque.length) {
      const [x, y, cnt] = deque.shift();
      if (x === N - 1 && y === M - 1) return cnt; // (N,M) 위치에 도달하면 종료한다.

      for (let i = 0; i < 4; i++) { // 현재 위치 (x,y)에서 상하좌우 한번씩 이동을 탐색한다.
        const [nx, ny] = [x + dx[i], y + dy[i]];
        if (nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
        if (check[nx][ny]) continue;
        check[nx][ny] = 1;
        if (adjM[nx][ny]) {
          adjM[nx][ny] = 0;
          deque.push([nx, ny, cnt + 1]);
        } else {
          deque.unshift([nx, ny, cnt]); // 벽이 없어서 바로 이동하는 경우를 우선적으로 처리하도록 맨 앞에 넣어준다.
        }
      }
    }
  }
  return bfs(0, 0);
};

// 백준에서 입력을 받는 코드
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' 카테고리의 다른 글

[백준] 2250 트리의 높이와 너비 - JavaScript(NodeJS)  (0) 2021.06.03
[백준] 1991 트리 순회 - JavaScript(NodeJS)  (1) 2021.06.03
[백준] 14226 이모티콘 - JavaScript(NodeJS)  (0) 2021.06.01
[백준] 13549 숨바꼭질3 - JavaScript(NodeJS)  (0) 2021.06.01
[백준] 13913 숨바꼭질4 - JavaScript(NodeJS)  (0) 2021.05.31
    'DS & Algorithm/baekjoon' 카테고리의 다른 글
    • [백준] 2250 트리의 높이와 너비 - JavaScript(NodeJS)
    • [백준] 1991 트리 순회 - JavaScript(NodeJS)
    • [백준] 14226 이모티콘 - JavaScript(NodeJS)
    • [백준] 13549 숨바꼭질3 - JavaScript(NodeJS)
    jiho_bae
    jiho_bae
    하루에 한 걸음씩

    티스토리툴바