Pattern
BFS
- ๋ฒ์ง๊ธฐ ๋ฌธ์ (๋ถ, ๋ถํจ, ์ค์ผ, ๋ฐ์ด๋ฌ์ค ๋ฑ)
-> ์ฃผ์ด์ง๋ ๊ฐ ์์น๋ฅผ queue์ ์ถ๊ฐํ๊ณ BFS ์์
-> ๋ง์ฝ ์ด๋ํ๋ ๋์์ด ๋์ผ ๋, ์๋ก ๋
๋ฆฝ์ ์์ง์์ผ ๋
-> ํ๋๋ฅผ ๋๊น์ง BFS ๋๋ฆฌ๊ณ , ์ด ๊ฐ์ ๋น๊ตํ๋ฉด์ ๋ค๋ฅธ ํ๋ BFS ์งํ
- ๋ญ์ณ์๋ ๋ฉ์ด๋ฆฌ์ ๊ฐ์๋ฅผ ์ธ๋ ๋ฌธ์ (๋ญ์ณ์๋ ๊ตฌ์ญ์ ๊ฐ์ ์ธ๊ธฐ)
-> (0,0)๋ถํฐ ๋๊น์ง queue์ appendํ๋ ์์ผ๋ก ์งํ
-> ๊ทผ๋ฐ ๋ฐฉ๋ฌธ X, ๋ฉ์ด๋ฆฌ์ ๊ฐ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ์์น๋ง queue์ append
-> ์ดํ BFS ๋๋ฆฌ๊ณ , ๊ฐ while์ด ๋๋ ๋๋ง๋ค ๊ฐ์+1 ํด์ฃผ๋ฉด ์ด ๋ฉ์ด๋ฆฌ ๊ฐ์ ๋์ด
- State BFS (๋ฒฝ ๋ถ์๊ธฐ ์ต๋จ๊ฑฐ๋ฆฌ ๋ฑ)
-> ๋ฒฝ์ ์ค๊ฐ์ ๋ถ์๋ฉด์ ์ด๋ํ ๊ฒฝ๋ก, ๋ฒฝ์ ์ ๋ถ์๋ฉด์ ์ด๋ํ ๊ฒฝ๋ก๋ฅผ ๊ตฌ๋ถํด์ผ ํจ
-> queue์, ์ค๊ฐ์ ๋ฒฝ์ ๋ถ์๋์ง์ flag ๊ฐ์ ์ถ๊ฐ, (x,y,0or1)๋ฅผ append
-> (cx,cy,flag)์์,
-> (nx,ny)๊ฐ ๋ฒฝ์ด ์๋๋ฉด ํ์ฌ flag๋ฅผ ๋ฐ๋ผ์ ์งํ
-> (nx,ny)๊ฐ ๋ฒฝ์ด๊ณ , ์์ง flag๊ฐ 0์ด๋ผ๋ฉด ๋ฒฝ ๋ถ์๊ธฐ ์คํ, flag+=1
-> ์ค์ํ ์ : ๊ทธ๋ผ ๋ฒฝ์ ๋ถ์ ๊ฒฝ๋ก์ ์ ๋ถ์ ๊ฒฝ๋ก ์ค์ ๋ญ๊ฐ ๋ ์ต๋จ๊ฑฐ๋ฆฌ์ธ์ง?
-> ์ด์ฐจํผ BFS๋ ๋จผ์ ๋ชฉํ์ ๋๋ฌํ ๊ฒฝ๋ก๊ฐ ์ต๋จ๊ฑฐ๋ฆฌ์ (์ด๊ฒ ์ค์)
-> ๋ฐ๋ผ์ ๊ทธ ๊ฒฝ๋ก๊ฐ ๋ญ๋ ๊ฐ์ ๋จผ์ (n-1, m-1)์ ๋๋ฌํ๋ฉด ์ข
๋ฃ
DFS
- Depth-First Search
- ๊ทธ๋ํ ์์ ํ์ ๊ธฐ๋ฒ ์ค ํ๋
- ์์ ๋
ธ๋์์ ์ถ๋ฐ โ ํ์ชฝ ๋ถ๊ธฐ๋ฅผ ์ ํ๊ณ โ ์ต๋ ๊น์ด๊น์ง ํ์ โ ์ดํ ๋ค๋ฅธ ๋ถ๊ธฐ๋ก ์ด๋ํ์ฌ ํ์
- ์ฌ๊ท ํจ์ or ์คํ ์ด์ฉ
- FILO ํ์
- ํ ๋ฒ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ ๋ค์ ๋ฐฉ๋ฌธ X โ ๋ฐฉ๋ฌธ ์ฌ๋ถ ์ฒดํฌ ๋ฐฐ์ด ํ์
- ์์ํ ๋
ธ๋๋ฅผ ์ ํ ํ, ์ฌ์ฉํ ์๋ฃ๊ตฌ์กฐ ์ด๊ธฐํ
- ์ธ์ ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ ์์ฑ
- visit ๋ฐฐ์ด ์ด๊ธฐํ, ์์ ๋
ธ๋ ๋ฐฉ๋ฌธ ์ฒดํฌ
- ์คํ์ ์์ ๋
ธ๋ push
- ์คํ์์ ๋
ธ๋๋ฅผ ๊บผ๋ธ ํ, ๋
ธ๋์ ์ธ์ ๋
ธ๋๋ฅผ ๋ค์ ์คํ์ ์ฝ์
- ์คํ์์ ๋
ธ๋๋ฅผ pop โ ํ์ ์์์ ๊ธฐ๋ก
- ๊บผ๋ธ ๋
ธ๋์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฐธ๊ณ โ ๋ฏธ๋ฐฉ๋ฌธ ๋
ธ๋๋ผ๋ฉด, ์ธ์ ๋
ธ๋๋ฅผ ์คํ์ ์ฝ์
- ์ฝ์
ํ ์ธ์ ๋
ธ๋๋ค์ ๋ฐฉ๋ฌธ ์ฌ๋ถ ์ฒดํฌ
- ์คํ์ด ๋น์ด์์ ๋๊น์ง ๋ฐ๋ณต
BFS
- Breadth-First-Search
- ์์ ๋
ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก โ ๊ฐ๊น์ด ๋
ธ๋๋ฅผ ๋จผ์ ๋ฐฉ๋ฌธ
- FIFO ํ์ โ ํ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํ
- ๊ฐ๊น์ด ๋
ธ๋๋ถํฐ ํ์ โ ๋ชฉํ ๋
ธ๋์ ๋์ฐฉํ๋ ๊ฒฝ๋ก๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๋ โ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ณด์ฅ
- ์์ํ ๋
ธ๋๋ฅผ ์ ํ ํ, ์ฌ์ฉํ ์๋ฃ๊ตฌ์กฐ ์ด๊ธฐํ
- ๊ทธ๋ํ โ ์ธ์ ๋ฆฌ์คํธ๋ก ํํ
- visit ๋ฐฐ์ด ์ด๊ธฐํ, ์์ ๋
ธ๋ ๋ฐฉ๋ฌธ ์ฒดํฌ
- ํ์์ ์ํ์ฌ ํ๋ฅผ ์ฌ์ฉ โ ์์์ push
- ํ์์ ๋
ธ๋๋ฅผ ๊บผ๋ธ ํ, ๊บผ๋ธ ๋
ธ๋์ ์ธ์ ๋
ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์
- ํ์์ ๋
ธ๋๋ฅผ ๊บผ๋ด๋ฉด์ โ ํ์ ์์์ ๊บผ๋ธ ๋
ธ๋๋ฅผ ๊ธฐ๋ก
- ๊บผ๋ธ ๋
ธ๋์ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฐธ๊ณ โ ๋ฏธ๋ฐฉ๋ฌธ ๋
ธ๋๋ผ๋ฉด, ์ธ์ ๋
ธ๋๋ค์ ํ์ ์ฝ์
- ์ฝ์
ํ ์ธ์ ๋
ธ๋๋ค์ ๋ฐฉ๋ฌธ ์ฌ๋ถ ์ฒดํฌ
- ํ๊ฐ ๋น์ด์์ ๋๊น์ง ๋ฐ๋ณต
BFS๋ฅผ ์ง๋ ํจํด
- ์ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๋ฌป๋ ๋ฌธ์ ๋ ๋๋ถ๋ถ DFS์
- distance ๋ฐฐ์ด๊ณผ visited ๋ฐฐ์ด์ ํ๋๋ก ํฉ์ณ์ ๊ด๋ฆฌํ๋ฉด ์ข์
- visited๋ฅผ [-1]๋ก ์ด๊ธฐํ, ์ฌ๊ธฐ์ ์์ ๋
ธ๋ index ์์น๋ฅผ [0]์ผ๋ก ์ค์ ํ๋ฉด
- visited, distance ๋ชจ๋ ์ฒดํฌ ๊ฐ๋ฅ
- queue.pop(), queue.appendleft()
1. ์์, ์ข
์ ์
๋ ฅ
2. visited ๋ฐฐ์ด, queue ์ด๊ธฐํ
3. visited ๋ฐฐ์ด์ ์์์ ์ ์ฉ, queue ์ ์์์ append
4. BFS ์์
- ๋ชจ๋ ๋
ธ๋๋ฅผ "๊ทธ๋ฅ ๋ค ๋ฐฉ๋ฌธ"์ด๋ฉด while queue: ๋ก ์กฐ๊ฑด์ ์ก์ผ๋ฉด ๋จ
- "ํน์ ์ข
์ ๊น์ง ๋๋ฌ"์ด๋ฉด while visited[ํน์ ์ข
์ ]==-1: ๋ก ์ก์ผ๋ฉด ๋จ
4-1. queue.popํด์ cur์ ์ ์ฅ
4-2. ๊ฐ ์ ์๋ ๋ฐฉํฅ์ ๋ค ๋ฐ๋ณต๋ฌธ ๋๋ฉด์ ํ์ธ
- ์๋ก์ด ์์น๋ฅผ nx๋ผ๊ณ ํ๋ฉด, nx=cur+dir[i]
- nx๊ฐ ์ ํจํ ๋ฒ์(๋ฐ๋์ ํ์ํ ๋ฒ์) ์์ ์๋์ง ์ฒดํฌ, ์๋๋ผ๋ฉด continue
- position[nx]>0 ์ด๋ฉด continue (์ด๋ฏธ ๋ฐฉ๋ฌธํ๊ฑฐ๋, ๋ฐฉ๋ฌธ ์์ ์ธ ๋
ธ๋์ธ์ง ์ฒดํฌ)
- nx ์ ํจ ๋ฒ์๋ฅผ ๋จผ์ ์ฒดํฌํด์ผ nx index ์์น์ position ์ ๋ฐฉ๋ฌธํ ๋ out of index ์ค๋ฅ ์ ๋จ
- ์ ์กฐ๊ฑด ๋ชจ๋ ์ถฉ์กฑํ์ผ๋ฉด, <์ ํจ ๋ฒ์ ๋ด> + <์์ง ๋ฐฉ๋ฌธ X> ์ด๋ฏ๋ก queue.append
5. ์ต์ข
์ ์ผ๋ก ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
- "๊ทธ๋ฅ ๋ค ๋ฐฉ๋ฌธ" -> visited ๋ฐฐ์ด์ ๋๋ฉด์ max ๊ฐ ๋ฝ๊ณ , ์ถ๋ ฅ
- "ํน์ ์ข
์ " -> visited[ํน์ ์ข
์ ] ์ถ๋ ฅ