Sqsung DevLog

[백준] 5014번: 스타트링크 - Node.js (자바스크립트) 본문

Algorithm

[백준] 5014번: 스타트링크 - Node.js (자바스크립트)

sqsung 2023. 5. 22. 11:43

1. 문제 ㅡ 5014번: 스타트링크 (난이도: Silver I)

 

5014번: 스타트링크

첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다.

www.acmicpc.net

2. 풀이 ㅡ Node.js (자바스크립트)

const [
    buildingHeight,
    kangho, 
    startlink, 
    up, 
    down
] = require('fs').readFileSync('/dev/stdin').toString().trim().split(' ').map(val => +val);

const visited = Array.from({ length: buildingHeight }, () => false);

const bfsElevator = N => {
  const queue = [[N, 0]];
  visited[N] = true;

  while (queue.length) {
    const [kanghoCurrent, elevator] = queue.shift();

    if (kanghoCurrent === startlink) return elevator;

    [kanghoCurrent + up, kanghoCurrent - down].forEach(floor => {
      if (visited[floor] || floor < 1 || floor > buildingHeight) return;

      visited[floor] = true;

      queue.push([floor, elevator + 1]);
    });
  }
  return 'use the stairs';
};

console.log(bfsElevator(kangho));

 

2-1. 풀이 설명

데이터를 이진트리로 시각화하면 문제에 접근하기 훨씬 편해진다. 현재 강호의 위치를 기준으로 위 아래로 이동한 경우의 수 2개, 즉 강호가 이동하는 층 수 별로 두 개의 노드가 있다. 

 

 

강호가 시작한 층에서 시작해서 각 Up/Down일 때를 확인하고, 만약 스타트링크가 위치한 층 수와 같다면 현재까지 누적된 엘레베이터 클릭 수(elevator)를 반환한다. 

 

만약 큐에 들어있는 값이 없어서 while문이 종료되었다면, 강호가 타고있는 기괴한 엘레베이터로는 스타트링크까지 갈 수 없는 것이라 판단하여 'use the stairs'를 반환했다. 

 

2-2. 회고

  • 이번 문제를 풀기 전에 1697번: 숨바꼭질을 풀었는데, 두 문제가 유사하기도 하고 이번 문제가 더 쉬워서 풀이 하는 과정이 수월했다. 
  • 그럼에도 한번 틀렸는데, while문의 early return 조건 중 한나로 floor < 0 사용했기 때문. (0층 같은 건 없다...ㅎ)