일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 나이트의이동
- 6593번
- 정리
- 타입스크립트 프로그래밍
- 풀이
- 20365번
- 16439번
- 5014번
- javascript
- 17626번
- 한윤정이 이탈리아에 가서 아이스크림을 사먹는데
- 5427번
- 자바스크립트
- 123만들기
- 13913번
- 7526번
- 14940번
- 1969번
- 16953번
- 2422번
- 1926번
- 백준
- 토마토
- node.js
- 1541번
- 타입스크립트
- 알고리즘
- 2503번
- 맥주마시면서걸어가기
- 20300번
Archives
- Today
- Total
Sqsung DevLog
[백준] 14940번: 쉬운 최단거리 - Node.js (자바스크립트) 본문
1. 문제 ㅡ 14940번: 쉬운 최단거리 (난이도: Silver I)
14940번: 쉬운 최단거리
지도의 크기 n과 m이 주어진다. n은 세로의 크기, m은 가로의 크기다.(2 ≤ n ≤ 1000, 2 ≤ m ≤ 1000) 다음 n개의 줄에 m개의 숫자가 주어진다. 0은 갈 수 없는 땅이고 1은 갈 수 있는 땅, 2는 목표지점이
www.acmicpc.net
2. 풀이 ㅡ Node.js (자바스크립트)
const getDistances = () => {
const [info, ...input] = require('fs').readFileSync('dev/stdin').toString().trim().split('\n');
const [Y, X] = info.split(' ').map(val => +val);
const board = input.map(row => row.split(' ').map(val => (val === '0' ? 0 : val === '2' ? 2 : -1)));
const visited = Array.from({ length: Y }).map(() => Array.from({ length: X }, () => false));
const dirs = [[0, 1], [0, -1], [-1, 0], [1, 0]];
const queue = [];
for (let y = 0; y < board.length; y++) {
for (let x = 0; x < board[y].length; x++) {
if (board[y][x] !== 2) continue;
queue.push([x, y, 0]);
break;
}
}
while (queue.length) {
const [x, y, time] = queue.shift();
board[y][x] = time;
for (let i = 0; i < 4; i++) {
const xPos = x + dirs[i][0];
const yPos = y + dirs[i][1];
if (xPos < 0 || yPos < 0 || xPos >= X || yPos >= Y || board[yPos][xPos] === 0 || visited[yPos][xPos]) continue;
visited[yPos][xPos] = true;
board[yPos][xPos] = time + 1;
queue.push([xPos, yPos, time + 1]);
}
}
return board.map(row => row.join(' ')).join('\n');
};
console.log(getDistances());
2-1. 풀이 설명
각 칸에서 좌우상하로만 이동해서 값이 2인 도착점까지 몇 번 이동해야 갈 수 있는지 확인하는 문제다. 반대로, 풀이할 때는 도착점에서 BFS 탐색을 시작해서 각 칸까지의 최단거리를 찾으면 더 쉽다.
도착점의 x, y 좌표와 함께 거리를 나타내는 0과 함께 queue에 넣어주고 BFS 탐색을 시작한다.
- 탐색 중인 칸과 인접한 칸을 찾고, 값이 0, 즉 갈 수 없는 칸이거나, 이미 확인한 칸이면 queue에 넣지 않는다.
- 탐색해야 하는 칸인 경우 queue에 해당 칸의 x, y 좌표와 함께 거리 + 1을 한 값을 넣어주고, 해당 x, y 좌표에 해당하는 visited 배열의 값을 true로 변경해줘 다시 queue에 들어가는 일이 없도록 한다.
'Algorithm' 카테고리의 다른 글
[백준] 1927번: 최소 힙 - Node.js (자바스크립트) (1) | 2023.05.31 |
---|---|
[백준] 1969번: DNA - Node.js (자바스크립트) (1) | 2023.05.31 |
[백준] 9375번: 패션왕 신해빈 - Node.js (자바스크립트) (0) | 2023.05.27 |
[백준] 7569번: 토마토 (II) - Node.js (자바스크립트) (1) | 2023.05.26 |
[백준] 7576번: 토마토 - Node.js (자바스크립트) (2) | 2023.05.26 |