[Algorithm] ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ — ์ต๋จ ๊ฒฝ๋ก ์ฐพ๊ธฐ
๋ฌธ์ ๋ถ์
ํ๋ก๊ทธ๋๋จธ์ค ๋ ๋ฒจ 2์ ๋ฐฐ๋ฌ ๋ฌธ์ (12978)๋ ๋ง์ ๊ฐ์ N
, ๋ ๋ง์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ ์ ๋ณด road
, ๋ฐฐ๋ฌ ๊ฐ๋ฅํ ์๊ฐ(๊ฑฐ๋ฆฌ) K
๋ฅผ ์ธ์๋ก ๋ฐ์, 1๋ฒ ๋ง์์ ์๋ ์์์ ์ด K
์ดํ ์๊ฐ์ ๋ฐฐ๋ฌํ ์ ์๋ ๋ง์์ ๊ฐ์๋ฅผ ๋ฐํํด์ผ ํ๋ค.
- ๋ง์ ๊ฐ์
N
:1 ≤ N ≤ 50
- ๊ฑฐ๋ฆฌ ์ ๋ณด :
[[a, b, c], [...]]
a
b
: ๋ ๋ง์์ ๋ฒํธc
: ๋ ๋ง์์ ๊ฑฐ๋ฆฌ(์๊ฐ)
- ๋ฐฐ๋ฌ ๊ฐ๋ฅํ ์๊ฐ
K
:1 ≤ K ≤ 500,000
์ ๋ง์ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก 1๋ฒ๋ถํฐ 5๋ฒ ๋ง์๊น์ง ์ต์ ๋ฐฐ๋ฌ ์๊ฐ์ [๋ฒํธ, ์๊ฐ]
๋ฐฐ์ด ํํ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ๋ค. ๋ง์ฝ ๋ฐฐ๋ฌ ๊ฐ๋ฅํ ์๊ฐ K
๊ฐ 3์ด๋ผ๋ฉด 1, 2, 4, 5๋ฒ ๋ง์์ด ๋ชจ๋ 3์๊ฐ ์ดํ์ฌ์ ์ ๋ต์ 4๊ฐ ๋๋ค.
์ด์ฒ๋ผ 1๋ฒ ๋ง์์์ ๋ค๋ฅธ ๋ชจ๋ ๋ง์๊น์ง ์์๋๋ ์ต๋จ ๊ฑฐ๋ฆฌ(์๊ฐ)๋ฅผ ๊ณ์ฐํด์ผ๋ง ์ ๋ต์ ๊ตฌํ ์ ์๋ค. 1๋ฒ ๋ง์์์ 1๋ฒ ๋ง์๊น์ง์ ๊ฑฐ๋ฆฌ๋ ํญ์ 0์ผ๋ก ์ทจ๊ธํ๋ค. ์ด ๋ฌธ์ ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ๋ฉด ํด๊ฒฐํ ์ ์๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฅ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋๋ก ๊ธธ์ฐพ๊ธฐ ๋ฑ ํ์ค ์ธ๊ณ์์ ์์ฃผ ํ์ฉ๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ ๋์ ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.
- ์ถ๋ฐ ๋ ธ๋ ์ค์ (์ผ๋ฐ์ ์ผ๋ก 1๋ถํฐ ์์)
- ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ์ด๊ธฐํ
- ๋ฐฉ๋ฌธํ์ง ์์ (๋ ธ๋ ์ค ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์) ๋ ธ๋ ์ ํ
- ์ ํํ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ ๊ณ์ฐํด์ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ๊ฐฑ์
- 3~4๋ฒ ๊ณผ์ ๋ฐ๋ณต
๐ก ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋งค ์ ํ์์ ์ง์ญ์ ์ผ๋ก ์ต์ ์ ์ ํ์ ํตํด ์ ์ญ์ ์ธ ์ต์ ํด๋ฅผ ๊ตฌํ๋ ๋ฐฉ์์ด๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋งค ์ํฉ์์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์(๋น์ฉ์ด ๊ฐ์ฅ ์ ์) ๋ ธ๋๋ฅผ ์ ํํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค๋ ์ ์์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅํ๋ค. ์ด๋ฏธ ๊ณ์ฐํ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ๊ณ ์ฌํ์ฉํ๋ ์ ์ ์์ด ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ๊ณผ ์ ์ฌํ ๋ฉด๋ ์๋ค.
๋์ ๋ฐฉ์ ํบ์๋ณด๊ธฐ
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด(Distance Array), ํ์ ํ(Search Queue), ์ธ์ ๋ฆฌ์คํธ(Adjacency List) ์ด๋ ๊ฒ 3๊ฐ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค.
- ๊ฑฐ๋ฆฌ ๋ฐฐ์ด : ๊ฐ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด. ์์์ ๋ชจ๋ ๊ฐ์ ∞ ๋ฌดํ๋๋ก ์ด๊ธฐํ๋๋ฉฐ, ์ถ๋ฐ ๋ ธ๋์ ๊ฑฐ๋ฆฌ๋ 0์ผ๋ก ์ค์ ํ๋ค. ์ด ๋ฐฐ์ด์ ์๊ณ ๋ฆฌ์ฆ์ด ์งํ๋๋ฉด์ ๊ณ์ ์ ๋ฐ์ดํธ ๋๋ค.
- ํ์ ํ : ๋ค์๋ฒ ๋ฐฉ๋ฌธํ ๋ ธ๋ ๋ชฉ๋ก. ์ผ๋ฐ์ ์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋ ธ๋๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฒ์ํ๊ณ ๋จผ์ ๋ฐฉ๋ฌธํ๊ธฐ ์ํด ์ฐ์ ์์ ํ๋ก ๊ตฌํํ๋ค. ํ์ ํ์ ์ด๊ธฐ๊ฐ์ ์ถ๋ฐ ๋ ธ๋๋ก ์ค์ ํ๋ค.
- ์ธ์ ๋ฆฌ์คํธ : ๊ฐ ๋ ธ๋์ ์ธ์ ํด ์๋ ๋ ธ๋์ ๊ฑฐ๋ฆฌ(๊ฐ์ค์น) ์ ๋ณด. ์ด ๋ฆฌ์คํธ๋ฅผ ํตํด ์ฃผ์ด์ง ๋ ธ๋์์ ์ด๋ํ ์ ์๋ ์ธ์ ๋ ธ๋๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋ค.
ํ๋ผ๋ฏธํฐ๊ฐ N=5
, road=[[1,2,1],[2,3,3],[5,2,2],[1,4,2],[5,3,1],[5,4,2]]
์ผ ๋ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด, ํ์ ํ, ์ธ์ ๋ฆฌ์คํธ ๋ฐ ๋
ธ๋ ๊ทธ๋ํ๋ ์๋ ์ด๋ฏธ์ง์ฒ๋ผ ๊ตฌ์ฑ๋๋ค.
๋จผ์ ์์ ๋ ธ๋(N1)์ ์ธ์ ํด ์๋ ๋ ธ๋๋ฅผ ์ดํด๋ณธ๋ค. ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํตํด N1์ N2, N4 ๋ ธ๋์ ์ฐ๊ฒฐ๋์ด ์๋ ๊ฑธ ํ์ธํ ์ ์๋ค. N1์์ N2๊น์ง์ ๊ฑฐ๋ฆฌ๋ 1์ด๋ค. 1์ ํ์ฌ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ์ ์ฅ๋์ด ์๋ ∞ ๋ฌดํ๋๋ณด๋ค ์์ผ๋ฏ๋ก ๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ์ ๋ฐ์ดํธํ๋ค. N4 ๋ ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ ์ญ์ ์ ์ฅ๋์ด ์๋ ๊ฑฐ๋ฆฌ ๊ฐ๋ณด๋ค ์์ผ๋ฏ๋ก ์ ๋ฐ์ดํธํ๋ค.
๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ์ ๋ฐ์ดํธํ ๋ ธ๋๋ ๋ ธ๋ ๋ฒํธ์ ํด๋น ๋ ธ๋๊น์ง์ ๊ฐ์ค์น(๊ฑฐ๋ฆฌ) ์ ๋ณด๋ฅผ ํ์ ํ์ ์ถ๊ฐํ๋ค. N2, N4์ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ์ ๋ฐ์ดํธ ํ์ผ๋ฏ๋ก [N2, D1], [N4, D2]๊ฐ ํ์ ์ถ๊ฐ๋๋ค.
- [N2, D1] : ์ถ๋ฐ ๋ ธ๋๋ถํฐ N2 ๋ ธ๋๊น์ง ๊ฑฐ๋ฆฌ๋ 1
- [N4, D2] : ์ถ๋ฐ ๋ ธ๋๋ถํฐ N4 ๋ ธ๋๊น์ง ๊ฑฐ๋ฆฌ๋ 2
์ด์ ํ์ ํ์์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ดํด๋ณธ๋ค. N2 ๋ ธ๋์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ผ๋ฏ๋ก ํ์ ํ์์ ๊บผ๋ธ๋ค. N2๋ N1, N3, N5์ ์ธ์ ํด ์๋ค. ๊ฐ๊ฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ดํด๋ณธ๋ค.
- N1 : ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ ธ๋์ฌ์ Pass (๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ์ ์ฅ๋ ๊ฐ๊ณผ ๋น๊ตํ์ ๋ ๋ ํฌ๋ค๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ก ๊ฐ์ฃผ)
- N3 : ∞ (๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ์ ์ฅ๋ ๊ฐ) > 4 (
์ถ๋ฐ๋ ธ๋ → N2 ๊ฑฐ๋ฆฌ 1
+N2 → N3 ๊ฑฐ๋ฆฌ 3
) - N5 : ∞ (๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ์ ์ฅ๋ ๊ฐ) > 3 (
์ถ๋ฐ๋ ธ๋ → N2 ๊ฑฐ๋ฆฌ 1
+N2 → N5 ๊ฑฐ๋ฆฌ 2
)
N3, N5 ๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ ๋ฐฐ์ด์ ์ ์ฅ๋ ๊ฑฐ๋ฆฌ ๊ฐ๋ณด๋ค ์์ผ๋ฏ๋ก ๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ์ ๋ฐ์ดํธ ํ๊ณ ํ์ ํ์ ์ถ๊ฐํ๋ค.
๋ค์ ํ์ ํ์์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค. ์์ ๋์ผํ๊ฒ ์ธ์ ํด ์๋ ๋ ธ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ํ์ธํ๋ค. ํ์ง๋ง ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ๋ชจ๋ ์์ฑํ์ผ๋ฏ๋ก ํ์ ์๋ N4, N5, N3์ ๋ชจ๋ ๊บผ๋ด์ ํ์ธํด๋ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ์๋ ๊ฐ์ด ๋ ์์ผ๋ฏ๋ก ๋ณ๊ฒฝ๋๋๊ฑด ์๋ค.
์ถ๋ฐ ์ง์ ์์ ๋ชจ๋ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ ์๋ฃํ๋ค.
- 1๋ฒ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ : 0
- 2๋ฒ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ : 1
- 3๋ฒ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ : 4
- 4๋ฒ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ : 2
- 5๋ฒ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ : 3
์ฐ์ ์์ ํ vs ์ผ๋ฐ ํ
๋ง์ฝ ๋ฐฐ์ด์ ์ด์ฉํด ํ๋ฅผ ๊ตฌํํ๋ค๋ฉด ๋ ธ๋ ์ ํ์ด ๋ฌด์์๋ก ์ด๋ค์ ธ์ ๋ถํ์ํ ๋ ธ๋ ๊ฒํ ๊ฐ ๋์ด๋๊ฒ ๋๋ค. ์๋ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด ํญ์ ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ๋ฎ์ ๋ ธ๋๋ฅผ ์ ํํ์ ๋, ๋จ 2๋ฒ์ ๊ฒํ (ํ์์ ๋ ธ๋ 2ํ ์ ํ)๋ง์ผ๋ก ๋ชจ๋ ๋ ธ๋์ ๋ํ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ํ์ธํ ์ ์๋ค.
๋ฐ๋ฉด, ์ฐ์ธก์ ์ผ๋ฐ ํ ๋ฐฉ์์ฒ๋ผ ๊ฐ์ค์น๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ๋นํจ์จ์ ์ธ ์์๋ก ๋ ธ๋๋ฅผ ์ ํํ ๊ฒฝ์ฐ 3๋ฒ์ ๊ฒํ ๊ฐ ํ์ํด์ง๋ค. ๊ทธ๋ํ์ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ์ด๋ฌํ ๋นํจ์จ์ ๋์ฑ ์ฆ๊ฐํด์ ์ ์ฒด ์๊ณ ๋ฆฌ์ฆ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.
๊ตฌํ ๋ฐฉ์์ ๋ฐ๋ฅธ ์๊ฐ ๋ณต์ก๋
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํ์ ํ๋ฅผ ์ด๋ค ์๋ฃ๊ตฌ์กฐ๋ก ๊ตฌํํ๋์ง์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ํฌ๊ฒ ๋ฌ๋ผ์ง๋ค. E(Edge)๋ ๊ฐ์ ์, V(Vertex)๋ ๋ ธ๋ ์๋ผ๊ณ ํ์ ๋ ์๊ฐ ๋ณต์ก๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ผ๋ฐ ํ๋ก ๊ตฌํํ ๊ฒฝ์ฐ : ๊ฐ ๋ ธ๋์ ๋ํด ์ต์ ๊ฑฐ๋ฆฌ ๊ฐ์ ์ฐพ๋ ์์ ์ ์ํํ๋ฏ๋ก $O(V^{2})$
- ์ต์ ํ(Min-Heap)์ผ๋ก ์ฐ์ ์์ ํ๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ :
- ์ฐ์ ์์ ํ์์ ์ต์ ๊ฑฐ๋ฆฌ๊ฐ์ ๊ฐ๋ ๋
ธ๋ dequeue : $O(V \log V)$
์ฐ์ ์์ ํ์์ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ๊บผ๋ด๋๋ฐ $O(\log V)$ ์๊ฐ์ด ์์๋๊ณ , ๋ชจ๋ ๋ ธ๋์ ๋ํด ์ด ์ฐ์ฐ์ ํ ๋ฒ์ฉ ์ํํ๋ฏ๋ก ์๊ฐ๋ณต์ก๋๋ $O(V \log V)$ — V๊ฐ์ dequeue ์ฐ์ฐ์ ๋ํ ์ด ํฉ - ์ธ์ ํ ๊ฐ์ ์ ๊ฒํ ํ๋ฉด์ ์ฐ์ ์์ ํ์ enqueue : $O(E \log V)$
์ฐ์ ์์ ํ์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ ์์ ์ ๊ฐ ๊ฐ์ ๋ง๋ค $O(\log V)$ ์๊ฐ์ด ์์๋๊ณ , ์ ์ฒด ๊ฐ์ ์ ๋ํด ์ด ์ฐ์ฐ์ ์ํํ๋ฏ๋ก ์๊ฐ๋ณต์ก๋๋ $O(E \log V)$ — E๊ฐ์ enqueue ์ฐ์ฐ์ ๋ํ ์ด ํฉ - ์ ์ฒด ์๊ฐ ๋ณต์ก๋ : $O(E \log V)$
์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ ์ $E$๊ฐ ๋ ธ๋ ์ $V$๋ณด๋ค ๋ง๊ฑฐ๋ ๊ฐ์์ ๋ณต์ก๋๋ ๊ฐ์ ์ฐ์ฐ์ ์ํด ์ง๋ฐฐ๋๋ค. ์ ์ฒด ์๊ฐ ๋ณต์ก๋๋ $O((E+V) \log V)$์ด์ง๋ง, ๊ฐ์ ์ฐ์ฐ์ด ์ง๋ฐฐ์ ์ด๋ผ๋ ๊ฐ์ ํ์ ์ด๋ฅผ $O(E \log V)$๋ก ๊ฐ์ํํ์ฌ ํํํ๋ค.
- ์ฐ์ ์์ ํ์์ ์ต์ ๊ฑฐ๋ฆฌ๊ฐ์ ๊ฐ๋ ๋
ธ๋ dequeue : $O(V \log V)$
์ฐ์ ์์ ํ๋ ์ผ๋ฐ ํ์ ๋น์ทํ์ง๋ง, ๊ฐ ์์๊ฐ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ฐ์ ์์๊ฐ ๋์ ์์๊ฐ ๋จผ์ ์ถ๋ ฅ๋๋ค๋ ์ ์ด ๋ค๋ฅด๋ค. ์ฐ์ ์์ ํ๋ ํฌ๊ฒ ๋ฐฐ์ด, ์ฐ๊ฒฐ๋ฆฌ์คํธ, ํ ์ด๋ ๊ฒ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ์ ์๋ค. ๊ทธ์ค ์์ ์ด์ง ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋ ํ์ผ๋ก ๊ตฌํํ๋ฉด ์ถ๊ฐ/์ ๊ฑฐ์ ํจ์จ์ฑ์ด ํฌ๊ฒ ํฅ์๋๋ค.
๊ตฌํ ๋ฐฉ๋ฒ | ์ฝ์ | ์ญ์ |
์์ ์๋ ๋ฐฐ์ด | O(1) | O(n) |
์์ ์๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ | O(1) | O(n) |
์ ๋ ฌ๋ ๋ฐฐ์ด | O(n) | O(1) |
์ ๋ ฌ๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ | O(n) | O(1) |
ํ | O(log n) | O(log n) |
์ด์ง ํธ๋ฆฌ๋ ๊ฐ ๋ถ๋ชจ ๋ ธ๋๊ฐ ์ผ์ชฝ/์ค๋ฅธ์ชฝ ์ต๋ 2๊ฐ์ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ง ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์์ ์ด์ง ํธ๋ฆฌ๋ ๋ง์ง๋ง ๋ ๋ฒจ์ ์ ์ธํ ๋ชจ๋ ๋ ๋ฒจ์ ์์ ํ ์ฑ์์ง ์ํ๋ก ์ ์งํด์ผ ํ๋ค. ๋๋ฌธ์ ์์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ ๋ ์ผ์ชฝ๋ถํฐ ์ฐจ๋ก๋๋ก ์ฑ์์ผ ํ๋ค. ์๋ ์ด๋ฏธ์ง ์ผ์ชฝ์ ์๋ ํธ๋ฆฌ๋ 31๋ฒ ๋ ธ๋์ ์์์ ์ค๋ฅธ์ชฝ๋ถํฐ ์ฑ์ ๊ธฐ ๋๋ฌธ์ ์์ ์ด์ง ํธ๋ฆฌ๊ฐ ์๋๋ค.
ํ์ ํฌ๊ฒ ์ต๋ ํ(Max Heap), ์ต์ ํ(Min Heap)์ผ๋ก ๋ถ๋ฅ๋๋ค. ์ต๋ ํ์ ๋ถ๋ชจ ๋ ธ๋๊ฐ ํญ์ ์์ ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , ์ต์ ํ์ ๋ถ๋ชจ ๋ ธ๋๊ฐ ํญ์ ์์๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค. ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฑฐ๋ฆฌ ๊ฐ์ด ๋ฎ์ ๋ ธ๋์ ๋์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ๋ฏ๋ก, ๋ฃจํธ ๋ ธ๋๊ฐ ๊ฐ์ฅ ์งง์ ๊ฑฐ๋ฆฌ ๊ฐ(์ฐ์ ์์๊ฐ ๋์)์ ๊ฐ๋ ์ต์ ํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ๋ค.
์ฝ๋๋ก ๊ตฌํ
๐ก ์ต์ ํ์ ์ฌ์ฉํ ์ฐ์ ์์ ํ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋งํฌ ์ฐธ๊ณ
์ธ์๋ก ๋ฐ์ road
๊ฑฐ๋ฆฌ ์ ๋ณด์ ๋ํ ์ธ์ ๋ฆฌ์คํธ(๊ทธ๋ํ์ ๊ฐ ์ ์ ๊ณผ ์ธ์ ํด ์๋ ์ ์ ๋ค์ ๋ฆฌ์คํธ๋ก ํํํ ์๋ฃ๊ตฌ์กฐ)๋ฅผ ์์ฑํ๋ createGraph
ํจ์. 1๋ถํฐ N
(๋
ธ๋ ๊ฐ์)๊น์ง ๋ฒํธ๋ฅผ ๋งค๊ธฐ๋ฏ๋ก ์ธ๋ฑ์ค 0์ ๋ฌด์ํ๊ธฐ ์ํด length
๊ฐ์ 1์ ๋ํด์ ๊ทธ๋ํ๋ฅผ ์์ฑํ๋ค. ์ฆ, ๊ทธ๋ํ์ ์ธ๋ฑ์ค๋ ์ค์ง์ ์ผ๋ก ๋
ธ๋ ๋ฒํธ๋ฅผ ๊ฐ๋ฆฌํค๊ณ 0๋ฒ ๋
ธ๋๋ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก 0๋ฒ ์ธ๋ฑ์ค๋ ํญ์ []
๋น ๋ฐฐ์ด์ด ๋๋ค.
const createGraph = (N, road) => {
const graph = Array.from({ length: N + 1 }, () => []);
road.forEach(([a, b, c]) => {
graph[a].push({ node: b, dist: c });
graph[b].push({ node: a, dist: c });
});
return graph; // [[], [{ node: 2, dist: 1 }, { node: 4, dist: 2 }], ...]
};
sort()
๋ฉ์๋๋ก ๊ตฌํํ ์ฐ์ ์์ ํ. ํ์ ๋
ธ๋๋ฅผ ์ถ๊ฐํ ๋๋ง๋ค ์ฐ์ ์์๊ฐ ๋์ ๋
ธ๋๊ฐ ๊ฐ์ฅ ์์ ์์นํ๋ค. ํ์ง๋ง ๋
ธ๋๋ฅผ ์ถ๊ฐํ ๋๋ง๋ค sort()
๋ฉ์๋๋ก ์ ๋ ฌ์ ์ํํ๊ธฐ ๋๋ฌธ์ $O(n \log n)$์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค. ์ต์ ํ(Heap)์ ์ด์ฉํด์ ๊ตฌํํ๋ฉด ์ถ๊ฐ/์ญ์ ๋ฅผ $O(\log n)$ ์๊ฐ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ด์ ๋์ฑ ํจ์จ์ ์ด๋ค.
class PriorityQueue {
constructor() {
this.nodes = [];
}
enqueue(node, priority) {
this.nodes.push({ node, priority });
this.sort();
}
dequeue() {
return this.nodes.shift();
}
sort() {
this.nodes.sort((a, b) => a.priority - b.priority);
}
isEmpty() {
return this.nodes.length === 0;
}
}
์๋ฐ์คํฌ๋ฆฝํธ๋ 64๋นํธ IEEE 754 ๋ถ๋์์์ ์ ์ฌ์ฉํ๋ฏ๋ก $2^{53}-1$ ๊น์ง์ ์ ์ ๊ฐ๋ง ๊ตฌ๋ณํ ์ ์๋ค. ๋ฐ๋ผ์ Number.Infinity
๋์ ์์ ํ ์ ์ ๋ฒ์๋ฅผ ๋ํ๋ด๋ ์์์ธ Number.MAX_SAFE_INTEGER
๋ฅผ ์ฌ์ฉํด์ ์ต๋จ ๊ฒฝ๋ก ๋ชฉ๋ก์ ์ด๊ธฐ๊ฐ์ ์ง์ ํ๋ค. ์ถ๋ฐ ์ง์ ๋ถํฐ ๊ฐ ๋
ธ๋๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ด๋ distances
๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ ๋
ธ๋ ๋ฒํธ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์๋ฅผ๋ค์ด distances[2]
๊ฐ์ด 3์ด๋ผ๋ฉด 2๋ฒ ๋
ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ 3์ด ๋๋ค.
๋ํ, ์ฐ์ ์์ ํ์์ ๊บผ๋ธ ๋
ธ๋์ ๊ฑฐ๋ฆฌ ๊ฐ์ด(์ถ๋ฐ ๋
ธ๋ → ํด๋น ๋
ธ๋๊น์ง ๊ฑฐ๋ฆฌ) distances
๋ฐฐ์ด์ ์ ์ฅ๋ ๊ฐ๊ณผ ๋น๊ตํ์ ๋ ๋ ํฌ๋ค๋ฉด(distances[currentNode] < currentDist
) ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ก ๊ฐ์ฃผํด์ ๋ถํ์ํ ์ฐ์ฐ์ ๊ฑด๋๋ธ ์ ์๋ค.
const dijkstra = (N, graph, start) => {
const distances = Array(N + 1).fill(Number.MAX_SAFE_INTEGER); // ๊ฐ ๋
ธ๋์ ์ต๋จ ๊ฒฝ๋ก ์ด๊ธฐํ
const queue = new PriorityQueue(); // ๋
ธ๋์ ํ์ ์์๋ฅผ ๊ด๋ฆฌํ ์ฐ์ ์์ ํ ์์ฑ
distances[start] = 0; // 1๋ฒ ์ถ๋ฐ ๋
ธ๋์ ์ต๋จ ๊ฒฝ๋ก๋ 0์ผ๋ก ์ง์ [ Max, 0, Max, Max, Max, Max ]
queue.enqueue(start, 0); // ์ถ๋ฐ ๋
ธ๋๋ฅผ ์ฐ์ ์์ ํ์ ์ถ๊ฐ
while (!queue.isEmpty()) {
const { node: currentNode, priority: currentDist } = queue.dequeue();
if (distances[currentNode] < currentDist) continue; // ํ์ฌ ๋
ธ๋์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ด๋ฏธ ๊ณ์ฐํ๋ค๋ฉด ๊ฑด๋๋ฐ๊ธฐ
graph[currentNode].forEach(({ node: nextNode, dist: nextDist }) => {
const newDist = currentDist + nextDist;
// ์๋ก ๊ณ์ฐํ ๊ฑฐ๋ฆฌ๊ฐ ๊ธฐ์กด์ ์๋ ค์ง ๊ฑฐ๋ฆฌ๋ณด๋ค ์งง์ ๋๋ง ์
๋ฐ์ดํธ
if (newDist < distances[nextNode]) {
distances[nextNode] = newDist;
queue.enqueue(nextNode, newDist); // ์ต์ ๊ฑฐ๋ฆฌ๋ก ์
๋ฐ์ดํธํ ๋
ธ๋๋ง ํ์ ์ถ๊ฐ
}
});
}
return distances;
};
function solution(N, road, K) {
const graph = createGraph(N, road); // road ๊ฑฐ๋ฆฌ ์ ๋ณด๋ฅผ ์ฌ์ฉํด์ ์ธ์ ๋ฆฌ์คํธ ์์ฑ
const distances = dijkstra(N, graph, 1); // ์์ ๋
ธ๋์์ ๊ฐ ๋
ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
return distances.filter(distance => distance <= K).length; // ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ K ์ดํ์ธ ๋ง์์ ์ ๊ณ์ฐ
}
solution(5, [[1,2,1],[2,3,3],[5,2,2],[1,4,2],[5,3,1],[5,4,2]], 3); // 4
const dijkstra = (N, graph, start) => {
const distances = Array(N + 1).fill(Number.MAX_SAFE_INTEGER); // ๊ฐ ๋
ธ๋์ ์ต๋จ ๊ฒฝ๋ก ์ด๊ธฐํ
const queue = [{ node: start, dist: 0 }]; // ํ์ํ ๋
ธ๋ ๋ชฉ๋ก์ ์ถ๋ฐ ๋
ธ๋(๊ฑฐ๋ฆฌ ๊ฐ 0) ์ถ๊ฐ
distances[start] = 0; // 1๋ฒ ์ถ๋ฐ ๋
ธ๋์ ์ต๋จ ๊ฒฝ๋ก๋ 0์ผ๋ก ์ง์ [ Max, 0, Max, Max, Max, Max ]
while (queue.length > 0) {
const { node: currentNode, dist: currentDist } = queue.shift();
if (distances[currentNode] < currentDist) continue; // ํ์ฌ ๋
ธ๋์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ด๋ฏธ ๊ณ์ฐํ๋ค๋ฉด ๊ฑด๋๋ฐ๊ธฐ
graph[currentNode].forEach(({ node: nextNode, dist: nextDist }) => {
const newDist = currentDist + nextDist;
// ์๋ก ๊ณ์ฐํ ๊ฑฐ๋ฆฌ๊ฐ ๊ธฐ์กด์ ์๋ ค์ง ๊ฑฐ๋ฆฌ๋ณด๋ค ์งง์ ๋๋ง ์
๋ฐ์ดํธ
if (newDist < distances[nextNode]) {
distances[nextNode] = newDist;
queue.push({ node: nextNode, dist: newDist }); // ์ต์ ๊ฑฐ๋ฆฌ๋ก ์
๋ฐ์ดํธํ ๋
ธ๋๋ง ํ์ ์ถ๊ฐ
}
});
}
return distances;
};
๋ ํผ๋ฐ์ค
- [์ค์ ์๊ณ ๋ฆฌ์ฆ] 0x1D๊ฐ - ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
- [์๊ณ ๋ฆฌ์ฆ] ๋ค์ต์คํธ๋ผ(Dijkstra) ์๊ณ ๋ฆฌ์ฆ
- [์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with Python] 30แแ กแผ แแ กแแ ตแจแแ ณแแ ณแ แ ก แแ ฌแแ กแซ แแ งแผแ แ ฉ แแ กแฏแแ ฉแ แ ตแแ ณแท
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[Algorithm] ์๋ฐ์คํฌ๋ฆฝํธ Map์ผ๋ก ๊ตฌํํ๋ LRU Cache ์๊ณ ๋ฆฌ์ฆ
[Algorithm] ์๋ฐ์คํฌ๋ฆฝํธ Map์ผ๋ก ๊ตฌํํ๋ LRU Cache ์๊ณ ๋ฆฌ์ฆ
2024.05.28 -
[Algorithm] ์ต์ ํ(Heap)์ผ๋ก ์ฐ์ ์์ ํ ๊ตฌํํ๊ธฐ
[Algorithm] ์ต์ ํ(Heap)์ผ๋ก ์ฐ์ ์์ ํ ๊ตฌํํ๊ธฐ
2024.05.28 -
[CS] ์ปดํจํฐ์ ์ค์(Real Number) ํํ - ๊ณ ์ ์์์ , ๋ถ๋ ์์์ , ์ง์ ํ๊ธฐ๋ฒ, ์ ๊ทํ ์ด ์ ๋ฆฌ
[CS] ์ปดํจํฐ์ ์ค์(Real Number) ํํ - ๊ณ ์ ์์์ , ๋ถ๋ ์์์ , ์ง์ ํ๊ธฐ๋ฒ, ์ ๊ทํ ์ด ์ ๋ฆฌ
2024.05.27 -
[Algorithm] ์ ํด๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ / ์์ธ์๋ถํด๋ก ์ต์๊ณต๋ฐฐ์ ์ต๋๊ณต์ฝ์ ๊ณ์ฐํ๊ธฐ
[Algorithm] ์ ํด๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ / ์์ธ์๋ถํด๋ก ์ต์๊ณต๋ฐฐ์ ์ต๋๊ณต์ฝ์ ๊ณ์ฐํ๊ธฐ
2024.05.26