์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- tcp ํ๋กํ ์ฝ
- ์์๋ฒํธ
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ๋ฐ์ดํฐ ์ ์ก
- xv6
- 99ํด๋ฝ
- ํ๋ก์ด๋์์
- leetcode
- ์ค๋ฅ์ ์ด
- reducible
- i-type
- ๋น์ฃผ๊ธฐ์ ํธ
- well known ํฌํธ
- ์ฝ๋ฉํ ์คํธ์ค๋น
- ์ค๋ฅ๊ฒ์ถ
- git merge
- ํญํด99
- ํ ํฐ ๋ฒ์ค
- ํ๋ ์ ๊ตฌ์กฐ
- ์ฃผ๊ธฐ์ ํธ
- ์ฐ๋ถํฌdb
- ์ค๋ธ์
- ์ค๋ ๋
- IEEE 802
- mariadb
- ๊ฐ๋ฐ์์ทจ์
- ์๋น์ค ํ๋ฆฌ๋ฏธํฐ๋ธ
- ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ
- tcp ์ธ๊ทธ๋จผํธ
- til
- Today
- Total
Unfazedโ๏ธ๐ฏ
[์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ] ๋ค์ต์คํธ๋ผ(dijkstra) ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ ๋ณธ๋ฌธ
[์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ] ๋ค์ต์คํธ๋ผ(dijkstra) ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
9taetae9 2024. 10. 31. 15:58์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฏธํ๋ค.
๋ค์ํ ๋ฌธ์ ์ํฉ
- ํ ์ง์ ์์ ๋ค๋ฅธ ํ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก
- ํ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก
- ๋ชจ๋ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก
๊ฐ ์ง์ ์ ๊ทธ๋ํ์์ ๋ ธ๋๋ก ํํ
์ง์ ๊ฐ ์ฐ๊ฒฐ๋ ๋๋ก๋ ๊ทธ๋ํ์์ ๊ฐ์ ์ผ๋ก ํํ
๋ค์ํ ๋ฌธ์ ์ํฉ ์ค ํ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๋ ์ํฉ์ ๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ ํด๊ฒฐํ ์ ์๋ค.
๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์์ ๊ฐ์ ์ด ์์ ๋ ์ ์์ ์ผ๋ก ๋์ํ๋ค.
- ํ์ค ์ธ๊ณ์ ๋๋ก(๊ฐ์ )์ ์์ ๊ฐ์ ์ผ๋ก ํํ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ํฉ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํด ๋ณผ ์ ์๋ค.
๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅ๋๋ค.
- ๋งค ์ํฉ์์ ๊ฐ์ฅ ๋น์ฉ์ด ์ ์ ๋ ธ๋๋ฅผ ์ ํํด ์์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
๋์ ๊ณผ์
1. ์ถ๋ฐ ๋ ธ๋๋ฅผ ์ค์
2. ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ์ด๊ธฐํ
- ์๊ธฐ ์์ ์ ์ ์ธํ ๋ชจ๋ ๋ ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฌดํ์ผ๋ก, ์๊ธฐ ์์ ์ 0(์๊ธฐ ์์ ์์ ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ์ต์ ๋น์ฉ)์ผ๋ก ์ค์
3. ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํ => ๊ทธ๋ฆฌ๋
4. ์ ํํ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ ๊ณ์ฐํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ๊ฐฑ์
3, 4๋ฒ ๊ณผ์ ์ ๋ฐ๋ณต(๋ชจ๋ ๋ ธ๋๊ฐ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋ ๋๊น์ง)
3๋ฒ ๊ณผ์ ์์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ ์ด์ ?
๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋์ค ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํ๊ธฐ์, ์ ํ๋ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ ๋ ์ด์ ๋ฐ๋์ง ์์์
์ฆ, ๋งค๋ฒ ํ์ฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ ๋๋ง๋ค, ํน์ ๋ ธ๋๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ํ์คํ ๊ฒฐ์ ํ๋ค๊ณ ๋ณผ ์ ์๋ค.
์ ๊ณผ์ ์ ํตํด ์ฐ๋ฆฌ๊ฐ ์ป์ ์ ์๋ ๊ฒ์ ์ถ๋ฐ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๋ค๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ์ด๋ค.
์ต๋จ ๊ฒฝ๋ก๋ฅผ ์๊ณ ์ถ๋ค๋ฉด ๋ณ๋์ ๋ก์ง์ด ์ฌ์ฉ๋์ด์ผ ํ๋ค. => (์ถํ ํ์ต)
์๊ณ ๋ฆฌ์ฆ ๋์๊ณผ์ ์์ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ๊ฐ ๋ ธ๋์ ๋ํ ํ์ฌ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ฒ๋ฆฌ ๊ณผ์ ์์ ๋ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ผ๋ฉด ์ด๋ฅผ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ๋ค์ ์ ๋ฐ์ดํธํ๋ค.
์๋ฅผ ๋ค์ด, ์ถ๋ฐ๋ ธ๋์์ A ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฒ์์ 8๋ก ๊ณ์ฐํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ์ ์ฅํ๋ค๊ณ ํ์.
์ดํ ์ถ๋ฐ๋ ธ๋์์ B(๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋)๋ฅผ ์ ํํ๊ณ
(์ถ๋ฐ๋ ธ๋์์ B๊น์ง์ ๊ฑฐ๋ฆฌ๋ 5) + (B ๋ ธ๋์์ A๋ ธ๋ ๊น์ง ๊ฑฐ๋ฆฌ 5)๋ผ๋ฉด ์ถ๋ฐ๋ ธ๋์์ ๋ ธ๋ B๋ฅผ ๊ฑฐ์ฒ A๋ ธ๋๋ก ๊ฐ๋ ๊ฒฝ๋ก์ ๊ธธ์ด(7)๊ฐ
์ด์ ์ ๊ฐฑ์ ํ๋ 8๋ณด๋ค ์งง์ผ๋ฏ๋ก, ์ถ๋ฐ ๋ ธ๋์์ A ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์์ 7๋ก ์ ๋ฐ์ดํธํ๋ค.
์์)
์ถ๋ฐ : 1๋ฒ ๋ ธ๋

๋ ธ๋ ๋ฒํธ | 1 | 2 | 3 | 4 | 5 | 6 |
๊ฑฐ๋ฆฌ | 0 | ๋ฌดํ | ๋ฌดํ | ๋ฌดํ | ๋ฌดํ | ๋ฌดํ |
Step 1) ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋์ธ 1๋ฒ ๋ ธ๋ ์ ํ

1๋ฒ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ์ ๊ฐ ์ ์๋ 2,3,4 ๋ ธ๋์ ๋ํด์ =>์์ ์ง์ ์ด 1๋ฒ์ด๋ฏ๋ก 1๋ฒ ๋ ธ๋์์ 1๋ฒ๋ ธ๋๋ฅผ ๊ฑฐ์ณ 2,3,4 ๋ ธ๋๋ก ๊ฐ๋ค๋ ๊ฒ
์์๋ ธ๋(1๋ฒ)์์ 2,3,4๋ฒ ๋ ธ๋๋ก ๊ฐ ์ ์๋ ์ต๋จ ๊ฑฐ๋ฆฌ vs ์์ ๋ ธ๋์์ 1๋ฒ ๋ ธ๋๊น์ง ๊ฑฐ๋ฆฌ 0 + 1๋ฒ๋ ธ๋ ๊ฑฐ์ฒ 2,3,4 ๋ ธ๋๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ
์ธ์ ๋ ธ๋ | ํ์ฌ๊ฐ | ๊ฑฐ์ฒ๊ฐ ๊ฒฝ์ฐ | ๊ฐฑ์ ์ฌ๋ถ |
2 | ๋ฌดํ | 0 + 2 | True |
3 | ๋ฌดํ | 0 + 5 | True |
4 | ๋ฌดํ | 0 + 1 | True |
์ง๊ธ์ ํ์ฌ ๊ฐ์ด ๋ชจ๋ ๋ฌดํ์ด๋ฏ๋ก ์์๋ ธ๋์์ 1๋ฒ๋ ธ๋๋ฅผ ๊ฑฐ์ฒ 2,3,4๋ฒ ๋ ธ๋๋ก ๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ ์งง์ผ๋ฏ๋ก ์ต๋จ ๊ฒฝ๋ก ํ ์ด๋ธ์ ๊ฐฑ์ ํ๋ค.
๋ ธ๋ ๋ฒํธ | 1 | 2 | 3 | 4 | 5 | 6 |
๊ฑฐ๋ฆฌ | 0 | 2 | 5 | 1 | ๋ฌดํ | ๋ฌดํ |
ํ๋ฒ ์ฒ๋ฆฌํ 1๋ฒ ๋ ธ๋๋ ๋ ์ด์ ์ ํ x (๋ฐฉ๋ฌธ ์ฒ๋ฆฌ) => ์ฌ๊ธฐ์ ํ์์ผ๋ก ํํ
Step 2) ์์ง ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋์ง ์์ ๋ ธ๋ ์ค์์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ 4๋ฒ ๋ ธ๋ ์ ํ

4๋ฒ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ์ ๊ฐ ์ ์๋ 3, 5๋ฒ ๋ ธ๋์ ๋ํด์ ๊ฑฐ๋ฆฌ ๋น๊ต
ํ์ฌ ์์๋ ธ๋(1๋ฒ)์์ 3, 5๋ฒ ๋ ธ๋๋ก ๊ฐ ์ ์๋ ์ต๋จ ๊ฑฐ๋ฆฌ vs ์์ ๋ ธ๋์์ 4๋ฒ ๋ ธ๋๊น์ง ๊ฑฐ๋ฆฌ + 4๋ฒ๋ ธ๋ ๊ฑฐ์ฒ 3,5๋ฒ ๋ ธ๋๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ
์ธ์ ๋ ธ๋ | ํ์ฌ๊ฐ | ๊ฑฐ์ฒ๊ฐ ๊ฒฝ์ฐ | ๊ฐฑ์ ์ฌ๋ถ |
3 | 5 | 1 + 3 | True |
5 | ๋ฌดํ | 1 + 1 | True |
4 ๋ฒ ๋ ธ๋๋ฅผ ๊ฑฐ์ฒ๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ์ ์ฅ๋ ๊ฐ๋ค ๋ณด๋ค ์์ผ๋ฏ๋ก ๋ ๋ ธ๋ ๋ชจ๋ ๊ฐฑ์
๋ ธ๋ ๋ฒํธ | 1(visited) | 2 | 3 | 4 | 5 | 6 |
๊ฑฐ๋ฆฌ | 0 | 2 | 4 | 1 | 2 | ๋ฌดํ |
4๋ฒ ๋ ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
step 3) ์์ง ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋์ง ์์ ๋ ธ๋ ์ค, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ 2๋ฒ ๋ ธ๋ ์ ํ (2, 5๋ฒ ๋ ธ๋ ๋๋ค ๊ฑฐ๋ฆฌ๊ฐ 2์ด๊ธฐ ๋๋ฌธ์ ๋ฒํธ ์์ 2 ์ ํ)

2๋ฒ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ์ ๊ฐ ์ ์๋ 3, 4๋ฒ ๋ ธ๋์ ๋ํด์ ๊ฑฐ๋ฆฌ ๋น๊ต (4๋ฒ ๋ ธ๋๋ ์ด๋ฏธ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ ๋ ธ๋์ด๋ฏ๋ก Skip ๊ฐ๋ฅ)
ํ์ฌ ์์๋ ธ๋(1๋ฒ)์์ 3, 4๋ฒ ๋ ธ๋๋ก ๊ฐ ์ ์๋ ์ต๋จ ๊ฑฐ๋ฆฌ vs ์์ ๋ ธ๋์์ 2๋ฒ ๋ ธ๋๊น์ง ๊ฑฐ๋ฆฌ + 2๋ฒ๋ ธ๋ ๊ฑฐ์ฒ 3,4๋ฒ ๋ ธ๋๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ
์ธ์ ๋ ธ๋ | ํ์ฌ๊ฐ | ๊ฑฐ์ฒ๊ฐ ๊ฒฝ์ฐ | ๊ฐฑ์ ์ฌ๋ถ |
3 | 4 | 2 + 3 | False |
4 | 1 | 2 + 2 | False |
๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ์ฌ ์ํ๊ฐ ๋ ์์ผ๋ฏ๋ก ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ๊ฐฑ์ ํ์ง ์์
๋ ธ๋ ๋ฒํธ | 1(visited) | 2 | 3 | 4(visited) | 5 | 6 |
๊ฑฐ๋ฆฌ | 0 | 2 | 4 | 1 | 2 | ๋ฌดํ |
2๋ฒ ๋ ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
step 4) ์์ง ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋์ง ์์ ๋ ธ๋ ์ค, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ 5๋ฒ ๋ ธ๋ ์ ํ

5๋ฒ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ์ ๊ฐ ์ ์๋ 3, 6๋ฒ ๋ ธ๋์ ๋ํด์ ๊ฑฐ๋ฆฌ ๋น๊ต
ํ์ฌ ์์๋ ธ๋(1๋ฒ)์์ 3, 6๋ฒ ๋ ธ๋๋ก ๊ฐ ์ ์๋ ์ต๋จ ๊ฑฐ๋ฆฌ vs ์์ ๋ ธ๋์์ 5๋ฒ ๋ ธ๋๊น์ง ๊ฑฐ๋ฆฌ + 5๋ฒ๋ ธ๋ ๊ฑฐ์ฒ 3,6๋ฒ ๋ ธ๋๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ
์ธ์ ๋ ธ๋ | ํ์ฌ๊ฐ | ๊ฑฐ์ฒ๊ฐ ๊ฒฝ์ฐ | ๊ฐฑ์ ์ฌ๋ถ |
3 | 4 | 2 + 1 | True |
6 | 1 | 2 + 2 | True |
๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ์ฌ๊ฐ๋ณด๋ค 5๋ฒ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ๊ฐ ๊ฒฝ์ฐ๊ฐ ์งง์ผ๋ฏ๋ก ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ๊ฐฑ์
๋ ธ๋ ๋ฒํธ | 1(visited) | 2(visited) | 3 | 4(visited) | 5 | 6 |
๊ฑฐ๋ฆฌ | 0 | 2 | 3 | 1 | 2 | 4 |
5๋ฒ ๋ ธ๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
step 5) ์์ง ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋์ง ์์ ๋ ธ๋ ์ค, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ 3๋ฒ ๋ ธ๋ ์ ํ

3๋ฒ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ์ ๊ฐ ์ ์๋ 2, 6๋ฒ ๋ ธ๋์ ๋ํด์ ๊ฑฐ๋ฆฌ ๋น๊ต (2๋ฒ ๋ ธ๋๋ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๊ฐ ๋์์ผ๋ฏ๋ก Skip ๊ฐ๋ฅ)
ํ์ฌ ์์๋ ธ๋(1๋ฒ)์์ 2, 6๋ฒ ๋ ธ๋๋ก ๊ฐ ์ ์๋ ์ต๋จ ๊ฑฐ๋ฆฌ vs ์์ ๋ ธ๋์์ 3๋ฒ ๋ ธ๋๊น์ง ๊ฑฐ๋ฆฌ + 3๋ฒ๋ ธ๋ ๊ฑฐ์ฒ 2,6๋ฒ ๋ ธ๋๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ
์ธ์ ๋ ธ๋ | ํ์ฌ๊ฐ | ๊ฑฐ์ฒ๊ฐ ๊ฒฝ์ฐ | ๊ฐฑ์ ์ฌ๋ถ |
2 | 2 | 3 + 3 | False |
6 | 4 | 3 + 5 | False |
๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ์ฌ ์ํ๊ฐ ๋ ์์ผ๋ฏ๋ก ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ ๊ฐฑ์ ํ์ง ์์
๋ ธ๋ ๋ฒํธ | 1(visited) | 2(visited) | 3 | 4(visited) | 5(visited) | 6 |
๊ฑฐ๋ฆฌ | 0 | 2 | 3 | 1 | 2 | 4 |
step 6) ์์ง ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋์ง ์์ ๋ ธ๋ ์ค, ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ 6๋ฒ ๋ ธ๋ ์ ํ => ์ฌ์ค์ ๋ง์ง๋ง ๋ ธ๋์ด๋ฏ๋ก Skip ํด๋ ๋จ
์ด๋ฏธ ๋๋จธ์ง ๋ ธ๋๋ค์ ๋ํ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋๋ฉด์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ๊ณ ์ ๋์๊ธฐ ๋๋ฌธ์ด๋ค.

6๋ฒ์ ๊ฑฐ์ฒ ๊ฐ ๋ ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก ๊ฐฑ์ ํ ๋ ธ๋๊ฐ ์กด์ฌํ์ง ์๊ธฐ๋ ํ๋ค.(์ธ์ ๋ ธ๋ ์์ด๋ ์ด๋ฏธ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋ ๋ ธ๋๋ค์ด๋ฏ๋ก ๊ฐฑ์ ์๋จ)
๋ ธ๋ ๋ฒํธ | 1(visited) | 2(visited) | 3(visited) | 4(visited) | 5(visited) | 6 |
๊ฑฐ๋ฆฌ | 0 | 2 | 3 | 1 | 2 | 4 |
์ด๋ ๊ฒ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ด ์์ฑ ๋์๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ด ํ ์ด๋ธ์ ํตํด ์์ ๋ ธ๋(1๋ฒ)์ผ๋ก ๋ถํฐ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๋ค๊น์ง์ ๊ฐ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ๊ฒ์ด ๋๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ : ๋งค ์ํฉ์์ ๋ฐฉ๋ฌธํ์ง ์์ ๊ฐ์ฅ ๋น์ฉ์ด ์ ์ ๋ ธ๋๋ฅผ ์ ํํด ์์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ฉฐ ํ ๋ฒ ์ฒ๋ฆฌ๋ ๋ ธ๋์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ ๊ณ ์ ๋์ด ๋ ์ด์ ๋ฐ๋์ง ์๋๋ค.
- ํ ๋จ๊ณ๋น ํ๋์ ๋ ธ๋์ ๋ํ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ํ์คํ ์ฐพ๋ ๊ฒ์ผ๋ก ์ดํดํ ์ ์๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํํ ๋ค์ ํ ์ด๋ธ์ ๊ฐ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ค.
- ์๋ฒฝํ ํํ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ค๋ฉด ์ถ๊ฐ์ ๊ธฐ๋ฅ์ด ํ์
๊ตฌํ์ ํ์ํ ์์ ๋ฐ ๊ตฌํ
private static final int INF = Integer.MAX_VALUE; //
int N; // ๋ ธ๋์ ๊ฐ์
int[][] graph; // ๊ฐ ๋ ธ๋์ ์ฐ๊ฒฐ๋์ด ์๋ ๋ ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋ 2์ฐจ์ ๋ฐฐ์ด
bool[] vsitied; // ๋ฐฉ๋ฌธํ ๋ ธ๋์ธ์ง ์ฒดํฌํ๋ ๋ฐฐ์ด
int[] d; // ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ
// n๊ฐ์ ๋
ธ๋๋ฅผ ๊ฐ์ง ๊ทธ๋ํ ์์ฑ
public Dijkstra(int n) {
this.N = n;
this.graph = new int[N][N];
this.visited = new boolean[N];
this.distance = new int[N];
// ๊ทธ๋ํ ์ด๊ธฐํ
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (i == j) {
graph[i][j] = 0; // ์๊ธฐ ์์ ์ผ๋ก์ ๊ฑฐ๋ฆฌ๋ 0
} else {
graph[i][j] = INF; // ๋ค๋ฅธ ๋ชจ๋ ๋
ธ๋๋ก์ ๊ฑฐ๋ฆฌ๋ ๋ฌดํ๋๋ก ์ด๊ธฐํ
}
}
}
}
// ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋ ์ค ๊ฐ์ฅ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋
ธ๋์ ๋ฒํธ๋ฅผ ๋ฐํ
private int getSmallestNode() {
int min = INF;
int index = 0;
for (int i = 0; i < N; i++) {
if (!visited[i] && distance[i] < min) {
min = distance[i];
index = i;
}
}
return index;
}
// ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํํ๋ ๋ฉ์๋
public void dijkstra(int start) {
// ์ต๋จ ๊ฑฐ๋ฆฌ ํ
์ด๋ธ ์ด๊ธฐํ
for (int i = 0; i < N; i++) {
distance[i] = graph[start][i];
}
// ์์ ๋
ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[start] = true;
// ์์ ๋
ธ๋๋ฅผ ์ ์ธํ N-1๊ฐ์ ๋
ธ๋์ ๋ํด ๋ฐ๋ณต
for (int i = 0; i < N - 1; i++) {
// ํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋
ธ๋๋ฅผ ๊บผ๋ด์ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
int current = getSmallestNode();
visited[current] = true;
// ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ค์ ํ์ธ
for (int j = 0; j < N; j++) {
if (!visited[j]) {
// ํ์ฌ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ์ ๋ค๋ฅธ ๋
ธ๋๋ก ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ ๊ฒฝ์ฐ ๊ฐฑ์
if (graph[current][j] != INF &&
distance[current] + graph[current][j] < distance[j]) {
distance[j] = distance[current] + graph[current][j];
}
}
}
}
}
์ฑ๋ฅ
V : ๋ ธ๋์ ๊ฐ์
์ด O(V)๋ฒ์ ๊ฑธ์ณ์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ๋งค๋ฒ ์ ํ ํ์ํด์ผ ํ๋ค.
๋ฐ๋ผ์ ์ ์ฒด ์๊ฐ ๋ณต์ก๋๋ O(V^2)์ด๋ค.
Java์์ 1์ด ๋์ ์์ ํ๊ฒ ์ํํ ์ ์๋ ์ฐ์ฐ ํ์๋ ๋๋ต 5 * 10^7์ด๋ผ ํ๋ค.
O(v^2) ๋ณต์ก๋์ ์๊ณ ๋ฆฌ์ฆ์์, ์ฐ์ฐ ํ์๋ v^2์ ๋น๋กํ๊ธฐ ๋๋ฌธ์
v^2 โค 5 * 10^7
v โค7071.07xx
๊ฒฐ๋ก
Java์์ O(v^2) ๋ณต์ก๋์ ์ฝ๋๋ฅผ 1์ด ์์ ์์ ํ๊ฒ ์คํํ๋ ค๋ฉด, v์ ์ต๋๊ฐ์ ๋๋ต 7000์ด๋ค.
V(์ ์ฒด ๋ ธ๋์ ๊ฐ์)๊ฐ 5000 ์ดํ๋ผ๋ฉด ํด๋น ์ฝ๋๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ 10000๊ฐ๋ฅผ ๋์ด๊ฐ๋ ๋ฌธ์ ์ผ ๊ฒฝ์ฐ 10000ยฒ = 100,000,000 (1์ต) ์ฐ์ฐ ์๊ตฌ => ์๊ฐ ์ด๊ณผ ๋ฐ์
=> ์ด ๊ฒฝ์ฐ ์ฐ์ ์์ ํ ์ฌ์ฉ์ ๊ณ ๋ คํด๋ณด์.
์ฐ์ ์์ ํ(Priority Queue) : ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฅ ๋จผ์ ์ญ์
์คํ(Stack) : ๊ฐ์ฅ ๋์ค์ ์ฝ์ ๋ ๋ฐ์ดํฐ ๊ฐ์ ๋จผ์ ์ญ์
ํ(Queue) : ๊ฐ์ฅ ๋จผ์ ์ฝ์ ๋ ๋ฐ์ดํฐ ๊ฐ์ฅ ๋จผ์ ์ญ์
Java PriorityQueue์ ์ฃผ์ ์๊ฐ๋ณต์ก๋
- ์ฝ์ (offer/add): O(log N)
- ์ญ์ (poll/remove): O(log N)
- ์ต์๊ฐ/์ต๋๊ฐ ํ์ธ(peek): O(1)
์ฐ์ ์์ ํ ์ฌ์ฉํ ์ต์ ํ๋ ๋ค์ต์คํธ๋ผ ์ต๋จ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
private static final int INF = Integer.MAX_VALUE;
private int N; // ๋
ธ๋ ๊ฐ์
private List<List<Node>> graph; // ์ธ์ ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ ํํ
private int[] distance; // ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด
- 2์ฐจ์ ๋ฐฐ์ด โ ์ธ์ ๋ฆฌ์คํธ(List<List<Node>>)
- ๊ณต๊ฐ๋ณต์ก๋: O(Vยฒ) โ O(V + E)
- ์ค์ ์กด์ฌํ๋ ๊ฐ์ ๋ง ์ ์ฅํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ํจ์จ์
private static final int INF = Integer.MAX_VALUE;
private int N; // ๋
ธ๋ ๊ฐ์
private List<List<Node>> graph; // ์ธ์ ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ ํํ
private int[] distance; // ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด
// ๋
ธ๋ ํด๋์ค ์ ์
private static class Node implements Comparable<Node> {
int index;
int distance;
Node(int index, int distance) {
this.index = index;
this.distance = distance;
}
@Override
public int compareTo(Node other) { // ๋ค๋ฅธ Node ๊ฐ์ฒด์ ๋น๊ต
return Integer.compare(this.distance, other.distance); // ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋น๊ต
}
// - ์์(-1): this.distance < other.distance
// - 0: this.distance == other.distance
// - ์์(1): this.distance > other.distance
}
compareTo ๋ฉ์๋ : ์ฐ์ ์์ ํ(PriorityQueue)์์ ๋ ธ๋๋ค์ ์์๋ฅผ ์ ํ๋ ๋ฐ ์ฌ์ฉ
์ฐ์ ์์ ํ๋ ์ด compareTo ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋ ธ๋๋ฅผ ๋จผ์ ๋ฐํ
O(Vยฒ)์์ O(E log V)๋ก ์๊ฐ๋ณต์ก๋ ๊ฐ์
public OptimizedDijkstra(int n) {
this.N = n;
this.distance = new int[N];
// ์ธ์ ๋ฆฌ์คํธ ์ด๊ธฐํ
this.graph = new ArrayList<>();
for (int i = 0; i < N; i++) {
graph.add(new ArrayList<>());
}
}
// ๊ฐ์ ์ ๋ณด ์ถ๊ฐ
public void addEdge(int from, int to, int weight) {
graph.get(from).add(new Node(to, weight));
// ์๋ฐฉํฅ ๊ทธ๋ํ์ธ ๊ฒฝ์ฐ ์๋ ์ค ์ถ๊ฐ
// graph.get(to).add(new Node(from, weight));
}
public void dijkstra(int start) {
// ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด ์ด๊ธฐํ
Arrays.fill(distance, INF);
distance[start] = 0;
// ์ฐ์ ์์ ํ ์์ฑ
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.offer(new Node(start, 0));
while (!pq.isEmpty()) {
Node current = pq.poll();
int currentIndex = current.index;
int currentDistance = current.distance;
// ํ์ฌ ๊ฑฐ๋ฆฌ๊ฐ ์ด๋ฏธ ์ ์ฅ๋ ๊ฑฐ๋ฆฌ๋ณด๋ค ํฌ๋ฉด ์คํต
if (currentDistance > distance[currentIndex]) continue;
// ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค ํ์
for (Node next : graph.get(currentIndex)) {
int cost = currentDistance + next.distance;
// ํ์ฌ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ๊ฐ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ ๊ฒฝ์ฐ ๊ฐฑ์
if (cost < distance[next.index]) {
distance[next.index] = cost;
pq.offer(new Node(next.index, cost));
}
}
}
}
public static void main(String[] args) {
// ์์: 6๊ฐ ๋
ธ๋์ ๊ทธ๋ํ
OptimizedDijkstra graph = new OptimizedDijkstra(6);
// ๊ฐ์ ์ ๋ณด ์ถ๊ฐ
graph.addEdge(0, 1, 4);
graph.addEdge(0, 2, 2);
graph.addEdge(1, 2, 1);
graph.addEdge(1, 3, 5);
graph.addEdge(2, 3, 8);
graph.addEdge(2, 4, 10);
graph.addEdge(3, 4, 2);
graph.addEdge(3, 5, 6);
graph.addEdge(4, 5, 3);
// ๋
ธ๋ 0์์ ์์ํ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ํ
graph.dijkstra(0);
// ๊ฒฐ๊ณผ ์ถ๋ ฅ
graph.printResult();
}
์ฐธ๊ณ ์๋ฃ
https://youtu.be/acqm9mM1P6o?si=pQeYbNvNx1xmg2Jw