๐ŸŒฟ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (์ตœ๋‹จ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜)

๊ฒฝ์ดยท2024๋…„ 11์›” 7์ผ
post-thumbnail

๊ฒฝ๋กœ ์ƒ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ทธ๋ž˜ํ”„์˜ ๊ฐ€์ค‘์น˜ ์—ฌ๋ถ€, ๊ฐ€์ค‘์น˜์˜ ๋ฒ”์œ„์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋‹ฌ๋ผ์ง„๋‹ค.

๋ณดํ†ต ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋Š” BFS, ๊ฐ€์ค‘์น˜๊ฐ€ ์–‘์ˆ˜์ผ ๊ฒฝ์šฐ ๋‹ค์ต์ŠคํŠธ๋ผ, ๊ฐ€์ค‘์น˜๊ฐ€ ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ ๋ฒจ๋งŒ-ํฌ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ด ํฌ์ŠคํŠธ์—์„œ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •๋ฆฌํ•œ๋‹ค.


๐ŸŒฟ ๋‹ค์ต์ŠคํŠธ๋ผ(Dijkstra) ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํŠน์ •ํ•œ ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  • ์ด ๋•Œ ๊ฐ€์ค‘์น˜๋Š” ๋ฐ˜๋“œ์‹œ ์Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค.
  • ์ฐธ๊ณ ๋กœ ๋ฐ์ดํฌ์ŠคํŠธ๋ผ๊ฐ€ ์›๋ž˜ ๋งž๋Š” ํ‘œํ˜„์ด๋ผ๊ณ  ํ•œ๋‹ค.

๐ŸŒฟ ๋™์ž‘ ์›๋ฆฌ

๋™์ž‘ ์›๋ฆฌ๋Š” ์ถœ๋ฐœ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋น„์šฉ์ด ์ ์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ณ , ๊ทธ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋ฅผ ์ตœ์†Œ ๋น„์šฉ์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  1. ์ถœ๋ฐœ ๋…ธ๋“œ ์„ค์ •
  2. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™” (๋ชจ๋“  ๊ฑฐ๋ฆฌ์˜ ์ดˆ๊ธฐ๊ฐ’์ด ๋ฌดํ•œ๋Œ€๋ผ๊ณ  ๊ฐ€์ •)
  3. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ ์„ ํƒ
  4. ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•ด ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๊ฐฑ์‹ 
  5. 3, 4์˜ ๊ณผ์ • ๋ฐ˜๋ณต

์œ„์˜ ๊ณผ์ •์„ ๊ทธ๋ฆผ์œผ๋กœ ์•Œ์•„๋ณด์ž
๋จผ์ € ์ด 6๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ๊ณ  ๊ฐ ๋…ธ๋“œ ์‚ฌ์ด์˜ ๋น„์šฉ์ด ์œ„์™€ ๊ฐ™๋‹ค๊ณ  ์ •์˜ํ•˜์ž
์ด ๋•Œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์€ ์‹œ์ž‘๋…ธ๋“œ์ธ 1๋ฒˆ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ฌดํ•œ๋Œ€๋กœ ์ •์˜ํ•œ๋‹ค.
1๋ฒˆ ๋…ธ๋“œ๋Š” ์‹œ์ž‘ ๋…ธ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— 0์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ค€๋‹ค. (1๋ฒˆ์—์„œ 1๋ฒˆ์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ 0์ด๊ธฐ ๋•Œ๋ฌธ)

๊ทธ ํ›„ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.
ํ˜„์žฌ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๊ณ  ๊ทธ ์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ์ธ 1๋ฒˆ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
๊ทธ ํ›„ 1๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ 2๋ฒˆ, 3๋ฒˆ, 4๋ฒˆ๋…ธ๋“œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

  • 2๋ฒˆ๋…ธ๋“œ๊ฐ€ 1๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด 0+2์˜ ๋น„์šฉ์ด ๋“ค๊ณ , 1๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ˜„์žฌ ๊ฐ’์ธ ๋ฌดํ•œ์ด ๋œ๋‹ค. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์€ ๋” ์ž‘์€ ๊ฐ’์ธ 2๋กœ ๊ฐฑ์‹ ๋œ๋‹ค.
  • 3๋ฒˆ๋…ธ๋“œ๊ฐ€ 1๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด 0+5์˜ ๋น„์šฉ์ด ๋“ค๊ณ , 1๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ˜„์žฌ ๊ฐ’์ธ ๋ฌดํ•œ์ด ๋œ๋‹ค. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์€ ๋” ์ž‘์€ ๊ฐ’์ธ 5๋กœ ๊ฐฑ์‹ ๋œ๋‹ค.
  • 4๋ฒˆ๋…ธ๋“œ๊ฐ€ 1๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด 0+1์˜ ๋น„์šฉ์ด ๋“ค๊ณ , 1๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ˜„์žฌ ๊ฐ’์ธ ๋ฌดํ•œ์ด ๋œ๋‹ค. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์€ ๋” ์ž‘์€ ๊ฐ’์ธ 1๋กœ ๊ฐฑ์‹ ๋œ๋‹ค.

๋‹ค์Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.
๋ฐฉ๋ฌธํ•œ 1๋ฒˆ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ์ธ 4๋ฒˆ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
๊ทธ ํ›„ 4๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ 3๋ฒˆ, 5๋ฒˆ๋…ธ๋“œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

  • 3๋ฒˆ๋…ธ๋“œ๊ฐ€ 4๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด 1+3์˜ ๋น„์šฉ์ด ๋“ค๊ณ , 4๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ˜„์žฌ ๊ฐ’์ธ 5๊ฐ€ ๋œ๋‹ค. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์€ ๋” ์ž‘์€ ๊ฐ’์ธ 4๋กœ ๊ฐฑ์‹ ๋œ๋‹ค.
  • 5๋ฒˆ๋…ธ๋“œ๊ฐ€ 4๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด 1+1์˜ ๋น„์šฉ์ด ๋“ค๊ณ , 4๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ˜„์žฌ ๊ฐ’์ธ ๋ฌดํ•œ์ด ๋œ๋‹ค. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์€ ๋” ์ž‘์€ ๊ฐ’์ธ 2๋กœ ๊ฐฑ์‹ ๋œ๋‹ค.

๋‹ค์Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.
๋ฐฉ๋ฌธํ•œ 1๋ฒˆ, 4๋ฒˆ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋Š” 2๋ฒˆ๋…ธ๋“œ์™€ 5๋ฒˆ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค.
๋‘˜ ์ค‘ ์•„๋ฌด๊ฑฐ๋‚˜ ๋จผ์ € ์ฒ˜๋ฆฌํ•ด๋„ ์ƒ๊ด€ ์—†์ง€๋งŒ ๋ณดํ†ต ๋…ธ๋“œ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๋…ธ๋“œ๋ฅผ ํƒํ•œ๋‹ค.
๋”ฐ๋ผ์„œ 2๋ฒˆ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ณ , 2๋ฒˆ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ 3๋ฒˆ, 4๋ฒˆ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

  • 3๋ฒˆ๋…ธ๋“œ๊ฐ€ 2๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด 2+3์˜ ๋น„์šฉ์ด ๋“ค๊ณ , 2๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ˜„์žฌ ๊ฐ’์ธ 4๊ฐ€ ๋œ๋‹ค. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์€ ๋” ์ž‘์€ ๊ฐ’์ธ 4๋กœ ๊ฐฑ์‹ ๋œ๋‹ค. (์‚ฌ์‹ค์ƒ ์œ ์ง€)
  • 4๋ฒˆ๋…ธ๋“œ๊ฐ€ 2๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด 2+2์˜ ๋น„์šฉ์ด ๋“ค๊ณ , 2๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ˜„์žฌ ๊ฐ’์ธ 1์ด ๋œ๋‹ค. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์€ ๋” ์ž‘์€ ๊ฐ’์ธ 1๋กœ ๊ฐฑ์‹ ๋œ๋‹ค. (์‚ฌ์‹ค์ƒ ์œ ์ง€)

๋‹ค์Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.
๋ฐฉ๋ฌธํ•œ 1๋ฒˆ, 4๋ฒˆ, 2๋ฒˆ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ์ธ 5๋ฒˆ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
๊ทธ ํ›„ 5๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ 3๋ฒˆ, 6๋ฒˆ๋…ธ๋“œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

  • 3๋ฒˆ๋…ธ๋“œ๊ฐ€ 5๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด 2+1์˜ ๋น„์šฉ์ด ๋“ค๊ณ , 5๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ˜„์žฌ ๊ฐ’์ธ 4๊ฐ€ ๋œ๋‹ค. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์€ ๋” ์ž‘์€ ๊ฐ’์ธ 3์œผ๋กœ ๊ฐฑ์‹ ๋œ๋‹ค.
  • 6๋ฒˆ๋…ธ๋“œ๊ฐ€ 5๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด 2+2์˜ ๋น„์šฉ์ด ๋“ค๊ณ , 5๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ˜„์žฌ ๊ฐ’์ธ ๋ฌดํ•œ์ด ๋œ๋‹ค. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์€ ๋” ์ž‘์€ ๊ฐ’์ธ 4๋กœ ๊ฐฑ์‹ ๋œ๋‹ค.

๋‹ค์Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.
๋ฐฉ๋ฌธํ•œ 1๋ฒˆ, 4๋ฒˆ, 2๋ฒˆ, 5๋ฒˆ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ์ธ 3๋ฒˆ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
๊ทธ ํ›„ 3๋ฒˆ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ 2๋ฒˆ, 6๋ฒˆ๋…ธ๋“œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

  • 2๋ฒˆ๋…ธ๋“œ๊ฐ€ 3๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด 3+3์˜ ๋น„์šฉ์ด ๋“ค๊ณ , 3๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ˜„์žฌ ๊ฐ’์ธ 2๊ฐ€ ๋œ๋‹ค. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์€ ๋” ์ž‘์€ ๊ฐ’์ธ 2๋กœ ๊ฐฑ์‹ ๋œ๋‹ค. (์‚ฌ์‹ค์ƒ ์œ ์ง€)
  • 6๋ฒˆ๋…ธ๋“œ๊ฐ€ 3๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด 3+5์˜ ๋น„์šฉ์ด ๋“ค๊ณ , 3๋ฒˆ๋…ธ๋“œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ˜„์žฌ ๊ฐ’์ธ 6์ด ๋œ๋‹ค. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์€ ๋” ์ž‘์€ ๊ฐ’์ธ 6์œผ๋กœ ๊ฐฑ์‹ ๋œ๋‹ค. (์‚ฌ์‹ค์ƒ ์œ ์ง€)

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ์ธ 6๋ฒˆ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
6๋ฒˆ ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋ณต์€ ์ข…๋ฃŒ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ํŠน์ •๋…ธ๋“œ์ธ 1๋ฒˆ๋…ธ๋“œ์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.
์‚ฌ์‹ค์ƒ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ํ˜„์žฌ ๊ธฐ์ค€ ๊ฐ€์žฅ ์ตœ์†Œ ๋น„์šฉ์„ ์†Œ๋ชจํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ํฌํ•จ๋˜๊ธฐ๋„ ํ•˜๊ณ , ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด์„ ๊ฐฑ์‹ ํ•ด ๋‚˜๊ฐ€๋Š” ๊ณผ์ •์—์„œ DP ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ํฌํ•จ๋˜๊ธฐ๋„ ํ•œ๋‹ค.


๐ŸŒฟ ์†Œ์Šค์ฝ”๋“œ(JS)

// ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, ๊ทธ๋ž˜ํ”„, ์ •์ /๊ฐ„์„ /๊ฐ€์ค‘์น˜ ์ •๋ณด
const n = 6;
const graph = Array.from({ length: n + 1 }, () => []);
const inputs = ['1 2 2', '1 3 5', '1 4 1', '2 3 3', '2 4 2', '3 2 3', '3 6 5', '4 3 3', '4 5 1', '5 3 1', '5 6 2']

// ์ •์ /๊ฐ„์„ /๊ฐ€์ค‘์น˜ ์ •๋ณด๋ฅผ ์ˆซ์ž๊ฐ’์œผ๋กœ ํŒŒ์‹ฑํ•˜์—ฌ ๊ทธ๋ž˜ํ”„์— ์ €์žฅํ•ด์ค€๋‹ค.
for (const input of inputs) {
  const [s, e, c] = input.split(' ').map(Number);
  
  graph[s].push([e, c]);
}

// ์ตœ๋‹จ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฒˆํ˜ธ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
const getMinNode = (distances, visited) => {
  let minDistance = Infinity;
  let minNode = -1;

  for (let i = 1; i <= n; i++) {
    if (!visited[i] && distances[i] < minDistance) {
      minDistance = distances[i];
      minNode = i;
    }
  }

  return minNode;
};

// ๋‹ค์ต์Šค๋“œ๋ผ ํ•จ์ˆ˜ ๊ตฌํ˜„
const dijkstra = (startNode) => {
  // ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ•  distance ๋ฐฐ์—ด, ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ๊ธฐ๋กํ•  visited๋ฐฐ์—ด
  const distances = Array(n + 1).fill(Infinity);
  const visited = Array(n + 1).fill(false);
  
  // ์‹œ์ž‘๋…ธ๋“œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋Š” 0
  distances[startNode] = 0;
 
  // ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
  // ๋ฌดํ•œ๋ฐ˜๋ณต์ด ์•„๋‹Œ for๋ฌธ์„ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค ํ•œ ๋ฒˆ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋Š” ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์œผ๋‹ˆ๊นŒ
  while (true) {
    const node = getMinNode(distances, visited);
    
    // -1์„ ๋ฆฌํ„ด๋ฐ›์•˜๋‹ค๋Š” ๊ฒƒ์€ ๋ฐฉ๋ฌธ์•ˆํ•œ ๋…ธ๋“œ์ค‘์— ์ตœ๋‹จ๋…ธ๋“œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ
    // ์ฆ‰ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ๊ฒฝ์šฐ ์ข…๋ฃŒํ•œ๋‹ค.
    if (node === -1) break;
    visited[node] = true;
	
    // ์ตœ๋‹จ๊ฒฝ๋กœ ๊ฐฑ์‹ 
    for (const [v, w] of graph[node]) {
      if (distances[node] + w < distances[v]) {
        distances[v] = distances[node] + w;
      }
    }
  }

  return distances;
};

// 1๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ฆฌํ„ดํ•œ๋‹ค.
dijkstra(1);

๐ŸŒฟ ๊ฐœ์„ ๋œ ๋‹ค์ต์ŠคํŠธ๋ผ?

๊ทธ๋ฆผ์œผ๋กœ ์„ค๋ช…๋œ ๋‚ด์šฉ์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ดค๋‹ค.
ํ˜„์žฌ ์ฝ”๋“œ์—์„œ๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์—์„œ ๋‹ค์Œ ํƒ์ƒ‰ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•  ๋•Œ, ์•„๋ž˜์™€ ๊ฐ™์ด getMinNode์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋งค๋ฒˆ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

const getMinNode = (distances, visited) => {
  let minDistance = Infinity;
  let minNode = -1;

  for (let i = 1; i <= n; i++) {
    if (!visited[i] && distances[i] < minDistance) {
      minDistance = distances[i];
      minNode = i;
    }
  }

  return minNode;
};

๋˜ํ•œ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด visited ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๋‹ค.
์ด ๋ฐฉ์‹์€ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ณ , ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ n๋ฒˆ์˜ ๋ฐ˜๋ณต, ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•˜๋Š”๋ฐ n๋ฒˆ์˜ ๋ฐ˜๋ณต์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(n^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

์šฐ์„ ์ˆœ์œ„ํ(ํž™)์„ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•˜๋ฉด ์œ„ ๊ณผ์ •์„ O(nlogn) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์šฐ์„ ์ˆœ์œ„ ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
๊ฐ€๋” ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ œํ•œ์–ธ์–ด๋กœ JavaScript๋งŒ ๋‘๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด ๋•Œ๋Š” ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ํฌ์ŠคํŠธ์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค.

์ด์™€ ๋ณ„๊ฐœ๋กœ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด๋Š” ๊ฒƒ์€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”ํ›„ ๋ณ„๋„๋กœ ํฌ์ŠคํŒ…์„ ํ•  ์˜ˆ์ •์ด๋‹ค!


๐ŸŒฟ Ref

profile
๋กํƒ€๋ฅด์˜ค๊ฐ€๋ฅด

0๊ฐœ์˜ ๋Œ“๊ธ€