๐ 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
๋๊ธ