문제
제한 사항
입출력 예
풀이
let input = require('fs').readFileSync('/dev/stdin').toString().trim();
const solution = (input) => {
const end = +input;
const visited = Array.from(Array(1001), () => Array(1001).fill(0));
const bfs = (start) => {
const queue = [];
visited[start][0] = 1;
queue.push([start, 0, 0]);
while (queue.length) {
const [cur, clipBoard, time] = queue.shift();
if (cur == end) return time;
if (cur <= 0 || cur > 1000) continue;
if (!visited[cur][cur]) {
visited[cur][cur] = 1;
queue.push([cur, cur, time + 1]);
}
if (clipBoard && cur + clipBoard <= 1000) {
if (!visited[cur + clipBoard][clipBoard]) {
visited[cur + clipBoard][clipBoard] = 1;
queue.push([cur + clipBoard, clipBoard, time + 1]);
}
}
if (!visited[cur - 1][clipBoard]) {
visited[cur - 1][clipBoard] = 1;
queue.push([cur - 1, clipBoard, time + 1]);
}
}
};
const time = bfs(1);
return time;
};
console.log(solution(input));
- 클립보드의 처리가 중요하다.
- 클립보드와 노드 둘다 방문 처리를 해야한다. 따로 나눠서 만들지 않고 visited 배열을 2차원 배열로 선언했다.
복습
const sol = (end) => {
const vistited = Array.from(Array(1001), () => Array(1001).fill(0));
const bfs = (start, end) => {
const queue = [];
vistited[start][0] = 1;
queue.push([start, 0, 0]);
while (queue.length) {
const [cur, clipBoard, time] = queue.shift();
if (cur === end) return time;
if (cur <= 0 || cur > 1000) continue;
if (!vistited[cur][cur]) {
vistited[cur][cur] = 1;
queue.push([cur, cur, time + 1]);
}
if (clipBoard && cur + clipBoard <= 1000) {
if (!vistited[cur + clipBoard][clipBoard]) {
vistited[cur + clipBoard][clipBoard] = 1;
queue.push([cur + clipBoard, clipBoard, time + 1]);
}
}
if (!vistited[cur - 1][clipBoard]) {
vistited[cur - 1][clipBoard] = 1;
queue.push([cur - 1, clipBoard, time + 1]);
}
}
};
const time = bfs(1, end);
return time;
};