반응형
▷ 문제 : 5014번 - 스타트링크
5014번: 스타트링크
첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다.
www.acmicpc.net
▷ 해결 날짜 : 2022.07.06
▷ 소요 시간 : 25분
▷ 풀이 과정 :
문제를 요약하면 아래와 같다.
F, S, G, U, D 이렇게 다섯 개가 주어지고 범위는 (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000)
건물은 1층부터 시작하고, 가장 높은 층은 F층이다.
현재 위치는 S이며, U버튼을 눌러서 위로, D 버튼을 눌러 아래로 갈 수 있다.
그렇게 해서 G층에 도달할 때 버튼을 몇 번 눌러서 도달했는지 반환해라.
단, G층에 갈 수 없다면 "use the stairs"를 출력한다.
문제를 요약해서 보니까 문제 자체가 매우 쉬워 보이는데, 사실 처음에 이해가 안 가서 뭔 소리인가 싶었다.
저 문제를 기반으로 풀기만 하면 되는데, 막상 구현을 하다 보니까 이전에 풀었던 문제와 비슷한 유형의 문제였다.
범위가 정해져 있으니 계속해서 카운팅을 해주면서 체크만 해주면 문제는 쉽게 해결할 수 있다.
▷ 구현
let fs = require("fs");
let input = fs.readFileSync("./dev/stdin").toString().split("\n");
const [F, S, G, U, D] = input[0].split(" ").map(Number);
const getBtnCountMinimum = (top, start, end, up, down) => {
const visited = Array(1000001).fill(0);
const queue = [[start, 0]];
while (queue.length) {
const [floor, count] = queue.shift();
if (visited[floor]) continue;
if (floor === end) return count;
for (const stairs of [floor + up, floor - down]) {
stairs >= 1 &&
stairs <= top &&
!visited[floor] &&
queue.push([stairs, count + 1]);
}
visited[floor] = 1;
}
return "use the stairs";
};
console.log(getBtnCountMinimum(F, S, G, U, D));
▷ 복기 :
골드 난이도를 이렇게 빠르게 풀어낼 줄은 몰랐는데, 문제가 익숙해서 그랬겠지 싶다.
반응형
댓글