π section09 - 5 - μ‘μμ§ μ°ΎκΈ°(BFS: μννΈλ¦¬νμ)
λ¬Έμ : νμμ μμΉμ μ‘μμ§μ μμΉκ° μμ§μ μμ μ’ν μ μΌλ‘ μ£Όμ΄μ§λ©΄ νμλ νμ¬ μμΉμμ μ‘μμ§μ μμΉκΉμ§ λ€μκ³Ό κ°μ λ°©λ²μΌλ‘ μ΄λνλ€. μ‘μμ§λ μμ§μ΄μ§ μκ³ μ μ리μ μλ€. νμλ ν λ²μ μ νλ‘ μμΌλ‘ 1, λ€λ‘ 1, μμΌλ‘ 5λ₯Ό μ΄λν μ μλ€. μ΅μ λͺ λ²μ μ νλ‘ νμκ° μ‘μμ§μ μμΉκΉμ§ κ° μ μλμ§ κ΅¬νλ νλ‘κ·Έλ¨μ μμ±νμΈμ.
BFS
λ₯Ό μ¬μ©νλ λ¬Έμ μΈλ°, μ BFS
λ₯Ό μ¬μ©νλμ§ κ°μλ₯Ό ν΅ν΄ λ°°μΈ μ μμλ€. κ²°λ‘ μ μΌλ‘ μν νΈλ¦¬, λ 벨 νΈλ¦¬λ₯Ό μ΄ν΄λ³΄λ©΄μ κΉμ΄ μ°μ νμμΈ DFS
μ²λΌ ν level
λ§ λκΉμ§ νκ³ λ€λ©° target
κ³Ό λμΌν λκΉμ§ νμνλ κ²μ΄ μλλΌ, ν λ 벨μμ μ΄λν μ μλ μ’νλ₯Ό μ΄ν΄λ³΄κ³ target
νκ³ λ€λ₯΄λ©΄ λ€μ λ 벨μ μ΄ν΄λ³΄κ³ (무νλ°λ³΅..) μ΄λ° μμΌλ‘ λμ΄ μ°μ νμμΌλ‘ νΈλ λ°©λ²μ΄ μ§κΈ λ¬Έμ μ μλ§λ€. μ¬λ΄μΌλ‘ μ΄ λ°©λ²μΌλ‘ λ°±μ€1697 - μ¨λ°κΌμ§μ ν μ μμΌλκΉ μ΄ λ¬Έμ λ₯Ό νκ³ λμ νλ² λμ ν΄λ³΄μ.
BFS
λ₯Ό μ΄μ©νμ¬ λ 벨 νμ, μν νΈλ¦¬ νμμ μ΄μ©νλ€.- νμ¬
queue
μμ μ΄λν μ μλ μλ‘μ΄ μ’ν(nv
)λ₯Ό λ€μqueue
μ λ£μ λtarget
κ³Ό κ°μμ§ νμΈνλ λ°©λ²μ΄queue
μμshift
ν λtarget
μ νμΈνλ λ°©λ²λ³΄λ€ μ€νμκ°μ μ‘°κΈμ΄λΌλ λ λ¨μΆμν¬ μ μλ€. nv>0 && nv=10000
μ ν μ΄μ λ μ’νκ° 1λΆν° 10000κΉμ§λ‘ μ ν΄μ Έ μκΈ° λλ¬Έμ λ²μλ₯Ό λ²μ΄λμ§ μλλ‘ νκΈ° μν¨μ΄λ€.visited
λ°°μ΄μ μ μΈν΄ μ΄λ―Έ νλ² νμν μ’νλ μλ‘μ΄ μ’νλ‘ μ΄λνμ§ λͺ»νκ² μ€μ νλ€.(visited
λ₯Ό μ μΈνμ§ μλλ€λ©΄ λκ°μ μ’νλ‘ μ΄λν κ²μ΄κ³ μ΄λ λΆ νμν μ°μ°μΌλ‘ μ΄μ΄μ§λ€.)- νλ¨μ μ¬μ§μ²λΌ μν νΈλ¦¬ νμμ
level
μ μ°μ μ μΌλ‘ νμνλ κ²μ΄κΈ° λλ¬Έμ λ°©ν₯μ μνκ° μλ μ’μ°λ‘ μ§νλλ€. - νλ¨μ μ½λλ 2λ² λ°©λ²μ λΉκ΅νκΈ° μν΄ μμ±ν μ½λμΈλ°, μλ‘μ΄ μ’νλ₯Ό λ€μ
queue
μ λ£μ λ μ°μ° νμκ° μ λ€λ κ²μ μ μ μλ€.
// μλ‘μ΄ μ’νμμ target νμΈ
let s = 5;
let target = 14;
console.log(solution(s, target));
function solution(s, target){
let visited = Array.from({length: target+1}, () => 0);
let queue=[];
visited[s] = 1;
queue.push([s, 0]);
while(queue.length){
let [v, p] = queue.shift();
console.log(`v=${v}, p=${p}`)
for(let x of [v-1, v+1, v+5]){
if (x === target) return p+1;
if (!visited[x] && x >= 1 && x <= 10000){
visited[x]=1;
queue.push([x, p+1]);
}
}
}
}
ππ½
v=5, p=0
v=4, p=1
v=6, p=1
v=10, p=1
v=3, p=2
v=9, p=2
3
// queueμμ λμ€μ μ’ν νμΈ
let s = 5;
let position = 14;
console.log(solution(s, position));
function solution(s, position){
let visited = Array.from({length: position+1}, () => 0);
let queue=[];
visited[s] = 1;
queue.push([s, 0]);
while(queue.length){
let [v, p] = queue.shift();
console.log(`v=${v}, p=${p}`)
if (v === position) return p;
for(let x of [v-1, v+1, v+5]){
if (!visited[x] && x >= 1 && x <= 10000){
visited[x]=1;
queue.push([x, p+1]);
}
}
}
}
ππ½
v=5, p=0
v=4, p=1
v=6, p=1
v=10, p=1
v=3, p=2
v=9, p=2
v=7, p=2
v=11, p=2
v=15, p=2
v=2, p=3
v=8, p=3
v=14, p=3
3
λκΈ