λ¬Έμ π
ROR κ²μμ λ νμΌλ‘ λλμ΄μ μ§ννλ©°, μλ ν μ§μμ λ¨Όμ νκ΄΄νλ©΄ μ΄κΈ°λ κ²μμ
λλ€. λ°λΌμ, κ° νμ μλ ν μ§μμ μ΅λν 빨리 λμ°©νλ κ²μ΄ μ 리ν©λλ€.
μ§κΈλΆν° λΉμ μ ν νμ νμμ΄ λμ΄ κ²μμ μ§ννλ €κ³ ν©λλ€. λ€μμ 5 x 5 ν¬κΈ°μ 맡μ, λΉμ μ μΊλ¦ν°κ° (ν: 1, μ΄: 1) μμΉμ μκ³ , μλ ν μ§μμ (ν: 5, μ΄: 5) μμΉμ μλ κ²½μ°μ μμμ
λλ€.
μ κ·Έλ¦Όμμ κ²μμ λΆλΆμ λ²½μΌλ‘ λ§νμμ΄ κ° μ μλ κΈΈμ΄λ©°, ν°μ λΆλΆμ κ° μ μλ κΈΈμ
λλ€. μΊλ¦ν°κ° μμ§μΌ λλ λ, μ, λ¨, λΆ λ°©ν₯μΌλ‘ ν μΉΈμ© μ΄λνλ©°, κ²μ 맡μ λ²μ΄λ κΈΈμ κ° μ μμ΅λλ€.
μλ μμλ μΊλ¦ν°κ° μλ ν μ§μμΌλ‘ κ°λ λ κ°μ§ λ°©λ²μ λνλ΄κ³ μμ΅λλ€.
첫 λ²μ§Έ λ°©λ²μ 11κ°μ μΉΈμ μ§λμ μλ ν μ§μμ λμ°©νμ΅λλ€.
λ λ²μ§Έ λ°©λ²μ 15κ°μ μΉΈμ μ§λμ μλν μ§μμ λμ°©νμ΅λλ€.
μ μμμμλ 첫 λ²μ§Έ λ°©λ²λ³΄λ€ λ λΉ λ₯΄κ² μλν μ§μμ λμ°©νλ λ°©λ²μ μμΌλ―λ‘, μ΄ λ°©λ²μ΄ μλ ν μ§μμΌλ‘ κ°λ κ°μ₯ λΉ λ₯Έ λ°©λ²μ
λλ€.
λ§μ½, μλ νμ΄ μμ μ ν μ§μ μ£Όμμ λ²½μ μΈμλμλ€λ©΄ μλ ν μ§μμ λμ°©νμ§ λͺ»ν μλ μμ΅λλ€. μλ₯Ό λ€μ΄, λ€μκ³Ό κ°μ κ²½μ°μ λΉμ μ μΊλ¦ν°λ μλ ν μ§μμ λμ°©ν μ μμ΅λλ€.
κ²μ 맡μ μν mapsκ° λ§€κ°λ³μλ‘ μ£Όμ΄μ§ λ, μΊλ¦ν°κ° μλ ν μ§μμ λμ°©νκΈ° μν΄μ μ§λκ°μΌ νλ μΉΈμ κ°μμ μ΅μκ°μ return νλλ‘ solution ν¨μλ₯Ό μμ±ν΄ μ£ΌμΈμ. λ¨, μλ ν μ§μμ λμ°©ν μ μμ λλ -1μ return ν΄μ£ΌμΈμ.
μ νμ¬ν
mapsλ n x m ν¬κΈ°μ κ²μ 맡μ μνκ° λ€μ΄μλ 2μ°¨μ λ°°μ΄λ‘, nκ³Ό mμ κ°κ° 1 μ΄μ 100 μ΄νμ μμ°μμ
λλ€.
nκ³Ό mμ μλ‘ κ°μ μλ, λ€λ₯Ό μλ μμ§λ§, nκ³Ό mμ΄ λͺ¨λ 1μΈ κ²½μ°λ μ
λ ₯μΌλ‘ μ£Όμ΄μ§μ§ μμ΅λλ€.
mapsλ 0κ³Ό 1λ‘λ§ μ΄λ£¨μ΄μ Έ μμΌλ©°, 0μ λ²½μ΄ μλ μ리, 1μ λ²½μ΄ μλ μ리λ₯Ό λνλ
λλ€.
μ²μμ μΊλ¦ν°λ κ²μ 맡μ μ’μΈ‘ μλ¨μΈ (1, 1) μμΉμ μμΌλ©°, μλλ°© μ§μμ κ²μ 맡μ μ°μΈ‘ νλ¨μΈ (n, m) μμΉμ μμ΅λλ€.
μ μΆλ ₯ μ
maps | answer |
[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] | 11 |
[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] | -1 |
μ μΆλ ₯ μ μ€λͺ
μ
μΆλ ₯ μ #1
μ£Όμ΄μ§ λ°μ΄ν°λ λ€μκ³Ό κ°μ΅λλ€.
μΊλ¦ν°κ° μ νμ μ§μκΉμ§ μ΄λνλ κ°μ₯ λΉ λ₯Έ κΈΈμ λ€μ κ·Έλ¦Όκ³Ό κ°μ΅λλ€.
λ°λΌμ μ΄ 11μΉΈμ μΊλ¦ν°κ° μ§λκ°μΌλ―λ‘ 11μ return νλ©΄ λ©λλ€.
μ
μΆλ ₯ μ #2
λ¬Έμ μ μμμ κ°μΌλ©°, μλ ν μ§μμ λλ¬ν λ°©λ²μ΄ μμ΅λλ€. λ°λΌμ -1μ return ν©λλ€.
νμ΄ μ½λ π‘
class Queue {
constructor() {
this.items = {};
this.headIndex = 0;
this.tailIndex = 0;
}
enqueue(item) {
this.items[this.tailIndex] = item;
this.tailIndex++;
}
dequeue() {
const item = this.items[this.headIndex];
delete this.items[this.headIndex];
this.headIndex++;
return item;
}
peek() {
return this.items[this.headIndex];
}
size() {
return this.tailIndex - this.headIndex;
}
}
function solution(maps) {
const queue = new Queue();
const [n, m] = [maps.length, maps[0].length];
const [targetX, targetY] = [n - 1, m - 1];
const dx = [-1, 1, 0, 0];
const dy = [0, 0, -1, 1];
queue.enqueue([0, 0, 1]);
while (queue.size() !== 0) {
const [x, y, cost] = queue.dequeue();
if (x === targetX && y === targetY) {
return cost;
}
for (let i = 0; i < 4; i++) {
const nx = x + dx[i];
const ny = y + dy[i];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (maps[nx][ny] === 1) {
queue.enqueue([nx, ny, cost + 1]);
maps[nx][ny] = 0;
}
}
}
return -1;
}
νμ΄ ν΄μ€ π‘
ν΄λΉ λ¬Έμ λ BFS μκ³ λ¦¬μ¦μΌλ‘ νμ΄νλ€.
λ¨Όμ Queueλ λ°°μ΄μ μ¬μ©νμ§ μκ³ κ°μ²΄λ₯Ό νμ©ν Queueλ‘ νμ΄νλ€.
λ°°μ΄μ ν΅ν΄ Queueλ₯Ό ꡬννκ² λλ©΄ 맨 μμ μμλ₯Ό μ½μ , μμ νΉμ μ€κ°μ μ½μ μμ νλ κ²½μ° μκ° λ³΅μ‘λκ° O(N)μ΄ λκ³ κ°μ²΄λ₯Ό μ¬μ©νλ λ°©μμΌλ‘ νλ©΄ Queueμ λν μκ° λ³΅μ‘λλ O(1)λ‘ μ¬μ©ν μ μκΈ° λλ¬Έμ Queueλ λ°λ‘ λ§λ€μ΄μ£Όμλ€.
μ΄ λ¬Έμ λ BFSλ§ κΈ°λ³Έμ μΌλ‘ λ€λ£° μ μμΌλ©΄ μ½κ² ν΄κ²°ν μ μλ λ¬Έμ λΌκ³ μκ°νλ€.
λ¨Όμ , queueμλ μ²μ μΊλ¦ν°κ° μμνλ μμΉμ μ΄λν κ±°λ¦¬κ° queueλ‘ λ€μ΄κ°κ² λλ€.
λ€μμΌλ‘ whileλ¬Έμ ν΅ν΄μ queueμ μ무κ²λ μμ λ κΉμ§ λ°λ³΅νκ² λλ€.
whileλ¬Έ μμμλ queueμ μ²μ μμλ₯Ό κΊΌλ΄μ€ λ€μ κΊΌλΈ μμμ μμΉκ° λͺ©ν μμΉμ κ°λ€λ©΄ ν΄λΉ μμΉμ 거리λ₯Ό return νλ€.
μμ§ λͺ©ν μμΉκ° μλλΌλ©΄ κΊΌλΈ μμΉλ‘λΆν° λ, μ, λ¨, λΆμ νμνκ² λλ€.
κΊΌλΈ μμΉλ‘λΆν° κ° μκ° μλ κ³³μ΄λ©΄ λ€μ λ°©ν₯μΌλ‘ λ€μ νμνλ€. (continue)
κ·Έλ¦¬κ³ μ΄λν μμΉκ° λ²½μ΄ μλ κ³³μ΄λΌλ©΄ queueμλ€κ° μ΄λν μμΉμ 거리(λΉμ©)λ₯Ό λ£μ΄μ€λ€.
λ£μ΄μ€ λ€μλ λ°©λ¬Έ μ²λ¦¬λ₯Ό νκΈ° μν΄μ λ°©λ¬Έν κ³³μ λ²½μ΄ μλ κ²μ²λΌ 0μΌλ‘ λ°κΏμ€λ€.
μ΄λ κ² BFS νμμ νλ©΄μ λͺ©νμ§μ μ λλ¬νμ§ λͺ»νκ³ λλ¬λ€λ©΄ -1μ return νκ² λλ€.
μ±μ κ²°κ³Ό β