๋ฐ˜์‘ํ˜•

๋ฌธ์ œ ๋ถ„์„


ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ ˆ๋ฒจ 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. ์ถœ๋ฐœ ๋…ธ๋“œ ์„ค์ • (์ผ๋ฐ˜์ ์œผ๋กœ 1๋ถ€ํ„ฐ ์‹œ์ž‘)
  2. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”
  3. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ (๋…ธ๋“œ ์ค‘ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€) ๋…ธ๋“œ ์„ ํƒ
  4. ์„ ํƒํ•œ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•ด์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๊ฐฑ์‹ 
  5. 3~4๋ฒˆ ๊ณผ์ • ๋ฐ˜๋ณต

 

๐Ÿ’ก ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งค ์„ ํƒ์—์„œ ์ง€์—ญ์ ์œผ๋กœ ์ตœ์ ์˜ ์„ ํƒ์„ ํ†ตํ•ด ์ „์—ญ์ ์ธ ์ตœ์ ํ•ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋งค ์ƒํ™ฉ์—์„œ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€(๋น„์šฉ์ด ๊ฐ€์žฅ ์ ์€) ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค๋Š” ์ ์—์„œ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค. ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žฌํ™œ์šฉํ•˜๋Š” ์ ์— ์žˆ์–ด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ์œ ์‚ฌํ•œ ๋ฉด๋„ ์žˆ๋‹ค.

 

๋™์ž‘ ๋ฐฉ์‹ ํ†บ์•„๋ณด๊ธฐ


๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด(Distance Array), ํƒ์ƒ‰ ํ(Search Queue), ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(Adjacency List) ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

  1. ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด : ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •๋ณด. ์‹œ์ž‘์‹œ ๋ชจ๋“  ๊ฐ’์€ ∞ ๋ฌดํ•œ๋Œ€๋กœ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ, ์ถœ๋ฐœ ๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ๋Š” 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ์ด ๋ฐฐ์—ด์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ง„ํ–‰๋˜๋ฉด์„œ ๊ณ„์† ์—…๋ฐ์ดํŠธ ๋œ๋‹ค.
  2. ํƒ์ƒ‰ ํ : ๋‹ค์Œ๋ฒˆ ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ ๋ชฉ๋ก. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋จผ์ € ๋ฐฉ๋ฌธํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„ ์ˆœ์œ„ ํ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค. ํƒ์ƒ‰ ํ์˜ ์ดˆ๊ธฐ๊ฐ’์€ ์ถœ๋ฐœ ๋…ธ๋“œ๋กœ ์„ค์ •ํ•œ๋‹ค.
  3. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ : ๊ฐ ๋…ธ๋“œ์— ์ธ์ ‘ํ•ด ์žˆ๋Š” ๋…ธ๋“œ์™€ ๊ฑฐ๋ฆฌ(๊ฐ€์ค‘์น˜) ์ •๋ณด. ์ด ๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ฃผ์–ด์ง„ ๋…ธ๋“œ์—์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ N=5, road=[[1,2,1],[2,3,3],[5,2,2],[1,4,2],[5,3,1],[5,4,2]] ์ผ ๋•Œ ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด, ํƒ์ƒ‰ ํ, ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐ ๋…ธ๋“œ ๊ทธ๋ž˜ํ”„๋Š” ์•„๋ž˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ๊ตฌ์„ฑ๋œ๋‹ค.

 

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

 

ํ˜„์žฌ ๋…ธ๋“œ : [N1, D0]

์ด์ œ ํƒ์ƒ‰ ํ์—์„œ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์‚ดํŽด๋ณธ๋‹ค. N2 ๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์œผ๋ฏ€๋กœ ํƒ์ƒ‰ ํ์—์„œ ๊บผ๋‚ธ๋‹ค. N2๋Š” N1, N3, N5์™€ ์ธ์ ‘ํ•ด ์žˆ๋‹ค. ๊ฐ๊ฐ ๊ฑฐ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณธ๋‹ค.

 

  • N1 : ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์—ฌ์„œ Pass (๊ฑฐ๋ฆฌ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๊ฐ’๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋” ํฌ๋‹ค๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋กœ ๊ฐ„์ฃผ)
  • N3 : ∞ (๊ฑฐ๋ฆฌ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๊ฐ’) > 4 (์ถœ๋ฐœ๋…ธ๋“œ → N2 ๊ฑฐ๋ฆฌ 1 + N2 → N3 ๊ฑฐ๋ฆฌ 3)
  • N5 : ∞ (๊ฑฐ๋ฆฌ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๊ฐ’) > 3 (์ถœ๋ฐœ๋…ธ๋“œ → N2 ๊ฑฐ๋ฆฌ 1 + N2 → N5 ๊ฑฐ๋ฆฌ 2)

 

N3, N5 ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๊ฑฐ๋ฆฌ ๊ฐ’๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด์„ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ํƒ์ƒ‰ ํ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

 

ํ˜„์žฌ ๋…ธ๋“œ : [N2, D1]

๋‹ค์‹œ ํƒ์ƒ‰ ํ์—์„œ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค. ์œ„์™€ ๋™์ผํ•˜๊ฒŒ ์ธ์ ‘ํ•ด ์žˆ๋Š” ๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ํ™•์ธํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด์„ ๋ชจ๋‘ ์™„์„ฑํ–ˆ์œผ๋ฏ€๋กœ ํ์— ์žˆ๋Š” N4, N5, N3์„ ๋ชจ๋‘ ๊บผ๋‚ด์„œ ํ™•์ธํ•ด๋„ ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด์— ์žˆ๋Š” ๊ฐ’์ด ๋” ์ž‘์œผ๋ฏ€๋กœ ๋ณ€๊ฒฝ๋˜๋Š”๊ฑด ์—†๋‹ค.

 

ํ˜„์žฌ ๋…ธ๋“œ : [N4, D2]
ํ˜„์žฌ ๋…ธ๋“œ : [N5, D3]
ํ˜„์žฌ ๋…ธ๋“œ : [N5, D4]

์ถœ๋ฐœ ์ง€์ ์—์„œ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์„ ์™„๋ฃŒํ–ˆ๋‹ค.

 

  • 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)$๋กœ ๊ฐ„์†Œํ™”ํ•˜์—ฌ ํ‘œํ˜„ํ•œ๋‹ค.

 

์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์ผ๋ฐ˜ ํ์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ๊ฐ ์š”์†Œ๊ฐ€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์š”์†Œ๊ฐ€ ๋จผ์ € ์ถœ๋ ฅ๋œ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค. ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ํฌ๊ฒŒ ๋ฐฐ์—ด, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ, ํž™ ์ด๋ ‡๊ฒŒ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ์ค‘ ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š” ํž™์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์ถ”๊ฐ€/์ œ๊ฑฐ์˜ ํšจ์œจ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋œ๋‹ค.

 

๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์‚ฝ์ž… ์‚ญ์ œ
์ˆœ์„œ ์—†๋Š” ๋ฐฐ์—ด 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;
};

 

๋ ˆํผ๋Ÿฐ์Šค


 


๊ธ€ ์ˆ˜์ •์‚ฌํ•ญ์€ ๋…ธ์…˜ ํŽ˜์ด์ง€์— ๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”
๋ฐ˜์‘ํ˜•