π‘λ¬Έμ λΆμ μμ½
- λ―Έλ‘ νμ λ¬Έμ
- 1κ³Ό 0μΌλ‘ μ΄λ£¨μ΄μ§ λ―Έλ‘μμ
(1, 1)
μμ μΆλ°νμ¬ (N, M)
μ λμ°©ν λ, μ΅λ¨ κ²½λ‘μ κΈΈμ΄λ₯Ό ꡬν΄μΌ νλ€.
1
μ μ΄λν μ μλ κΈΈ, 0
μ λ²½
- μνμ’μ°λ‘λ§ μ΄λν μ μλ€.
π‘μκ³ λ¦¬μ¦ μ€κ³
- ν μ΄κΈ°ν: BFSμμλ νλ₯Ό μ¬μ©νμ¬ νμν μ’νλ₯Ό κ΄λ¦¬νλ€. μμ μ’ν
(0, 0)
μ νμ λ£κ³ νμμ μμνλ€.
- λ°©λ¬Έ μ²λ¦¬: λ°©λ¬Έν μ’νλ λ€μ λ°©λ¬Ένμ§ μλλ‘
visited
λ°°μ΄μ κΈ°λ‘νλ€.
- μνμ’μ° νμ: νμ¬ μ’νμμ μ, ν, μ’, μ°λ‘ μ΄λ κ°λ₯νμ§ νμΈνκ³ , κ° μ μμΌλ©΄ νμ λ£κ³ , μ΄λν μ’νμ μ΄μ μ’ν κ°μμ
+1
ν κ°μ μ μ₯νλ€.
- λμ°© νμΈ: BFSμμ
(N-1, M-1)
μ λμ°©νλ©΄ κ·Έλμ κ°μ΄ μ΅λ¨ κ²½λ‘κ° λλ€.
π‘μ½λ
const fs = require('fs');
const path = require('path');
const input = fs.readFileSync(path.join(__dirname, 'input.txt')).toString().trim().split('\\n');
// μ
λ ₯κ° μ²λ¦¬
const [N, M] = input[0].split(' ').map(Number); // 첫 μ€μμ Nκ³Ό M κ° κ°μ Έμ΄
const maze = input.slice(1).map(line => line.split('').map(Number)); // λλ¨Έμ§ μ€μμ λ―Έλ‘ μ 보 κ°μ Έμ΄
function bfs(maze, N, M) {
const directions = [
[0, 1], // μ€λ₯Έμͺ½
[1, 0], // μλμͺ½
[0, -1], // μΌμͺ½
[-1, 0] // μμͺ½
];
const queue = [[0, 0]]; // μμμ (0, 0)
const visited = Array.from({ length: N }, () => Array(M).fill(false));
visited[0][0] = true;
while (queue.length) {
const [x, y] = queue.shift();
// λμ°©μ§μ λλ¬νλ©΄ κ·Έ μΉΈμ κ°μ λ¦¬ν΄ (μ΅λ¨ κ²½λ‘)
if (x === N - 1 && y === M - 1) {
return maze[x][y];
}
// μνμ’μ° νμ
for (const [dx, dy] of directions) {
const nx = x + dx;
const ny = y + dy;
// λ²μλ₯Ό λ²μ΄λμ§ μκ³ , λ²½μ΄ μλκ³ , μμ§ λ°©λ¬Ένμ§ μμλ€λ©΄
if (nx >= 0 && ny >= 0 && nx < N && ny < M && maze[nx][ny] === 1 && !visited[nx][ny]) {
queue.push([nx, ny]);
visited[nx][ny] = true;
maze[nx][ny] = maze[x][y] + 1; // μ΄μ κ²½λ‘μμ +1
}
}
}
return -1; // λλ¬ν μ μλ κ²½μ°
}
// μ΅λ¨ κ²½λ‘ μΆλ ₯
console.log(bfs(maze, N, M));
π‘μκ°λ³΅μ‘λ
- μκ° λ³΅μ‘λ O(N * M)
- λ―Έλ‘μ λͺ¨λ μΉΈμ ν λ²μ© νμνκΈ° λλ¬Έμ μΉΈ μλ§νΌ μκ°μ΄ κ±Έλ¦°λ€