Hello Ocean! ๐ŸŒผ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/C++] ํ•ฉ์Šน ํƒ์‹œ ์š”๊ธˆ ๋ณธ๋ฌธ

Algorithm

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/C++] ํ•ฉ์Šน ํƒ์‹œ ์š”๊ธˆ

bba_dda 2021. 3. 1. 11:00
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ ์„ค๋ช…

[๋ณธ ๋ฌธ์ œ๋Š” ์ •ํ™•์„ฑ๊ณผ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ ๊ฐ๊ฐ ์ ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.]

๋ฐค๋Šฆ๊ฒŒ ๊ท€๊ฐ€ํ•  ๋•Œ ์•ˆ์ „์„ ์œ„ํ•ด ํ•ญ์ƒ ํƒ์‹œ๋ฅผ ์ด์šฉํ•˜๋˜ ๋ฌด์ง€๋Š” ์ตœ๊ทผ ์•ผ๊ทผ์ด ์žฆ์•„์ ธ ํƒ์‹œ๋ฅผ ๋” ๋งŽ์ด ์ด์šฉํ•˜๊ฒŒ ๋˜์–ด ํƒ์‹œ๋น„๋ฅผ ์•„๋‚„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. "๋ฌด์ง€"๋Š” ์ž์‹ ์ด ํƒ์‹œ๋ฅผ ์ด์šฉํ•  ๋•Œ ๋™๋ฃŒ์ธ ์–ดํ”ผ์น˜ ์—ญ์‹œ ์ž์‹ ๊ณผ ๋น„์Šทํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๋Š” ํƒ์‹œ๋ฅผ ์ข…์ข… ์ด์šฉํ•˜๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. "๋ฌด์ง€"๋Š” "์–ดํ”ผ์น˜"์™€ ๊ท€๊ฐ€ ๋ฐฉํ–ฅ์ด ๋น„์Šทํ•˜์—ฌ ํƒ์‹œ ํ•ฉ์Šน์„ ์ ์ ˆํžˆ ์ด์šฉํ•˜๋ฉด ํƒ์‹œ์š”๊ธˆ์„ ์–ผ๋งˆ๋‚˜ ์•„๋‚„ ์ˆ˜ ์žˆ์„ ์ง€ ๊ณ„์‚ฐํ•ด ๋ณด๊ณ  "์–ดํ”ผ์น˜"์—๊ฒŒ ํ•ฉ์Šน์„ ์ œ์•ˆํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์œ„ ์˜ˆ์‹œ ๊ทธ๋ฆผ์€ ํƒ์‹œ๊ฐ€ ์ด๋™ ๊ฐ€๋Šฅํ•œ ๋ฐ˜๊ฒฝ์— ์žˆ๋Š” 6๊ฐœ ์ง€์  ์‚ฌ์ด์˜ ์ด๋™ ๊ฐ€๋Šฅํ•œ ํƒ์‹œ๋…ธ์„ ๊ณผ ์˜ˆ์ƒ์š”๊ธˆ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆผ์—์„œ A์™€ B ๋‘ ์‚ฌ๋žŒ์€ ์ถœ๋ฐœ์ง€์ ์ธ 4๋ฒˆ ์ง€์ ์—์„œ ์ถœ๋ฐœํ•ด์„œ ํƒ์‹œ๋ฅผ ํƒ€๊ณ  ๊ท€๊ฐ€ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. A์˜ ์ง‘์€ 6๋ฒˆ ์ง€์ ์— ์žˆ์œผ๋ฉฐ B์˜ ์ง‘์€ 2๋ฒˆ ์ง€์ ์— ์žˆ๊ณ  ๋‘ ์‚ฌ๋žŒ์ด ๋ชจ๋‘ ๊ท€๊ฐ€ํ•˜๋Š” ๋ฐ ์†Œ์š”๋˜๋Š” ์˜ˆ์ƒ ์ตœ์ € ํƒ์‹œ์š”๊ธˆ์ด ์–ผ๋งˆ์ธ ์ง€ ๊ณ„์‚ฐํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ทธ๋ฆผ์˜ ์›์€ ์ง€์ ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์› ์•ˆ์˜ ์ˆซ์ž๋Š” ์ง€์  ๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • ์ง€์ ์ด n๊ฐœ์ผ ๋•Œ, ์ง€์  ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ n๊นŒ์ง€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ง€์  ๊ฐ„์— ํƒ์‹œ๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ฐ„์„ ์ด๋ผ ํ•˜๋ฉฐ, ๊ฐ„์„ ์— ํ‘œ์‹œ๋œ ์ˆซ์ž๋Š” ๋‘ ์ง€์  ์‚ฌ์ด์˜ ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • ๊ฐ„์„ ์€ ํŽธ์˜ ์ƒ ์ง์„ ์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์œ„ ๊ทธ๋ฆผ ์˜ˆ์‹œ์—์„œ, 4๋ฒˆ ์ง€์ ์—์„œ 1๋ฒˆ ์ง€์ ์œผ๋กœ(4→1) ๊ฐ€๊ฑฐ๋‚˜, 1๋ฒˆ ์ง€์ ์—์„œ 4๋ฒˆ ์ง€์ ์œผ๋กœ(1→4) ๊ฐˆ ๋•Œ ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์€ 10์›์œผ๋กœ ๋™์ผํ•˜๋ฉฐ ์ด๋™ ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์ƒ๋˜๋Š” ์ตœ์ € ํƒ์‹œ์š”๊ธˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.
    • 4→1→5 : A, B๊ฐ€ ํ•ฉ์Šนํ•˜์—ฌ ํƒ์‹œ๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์€ 10 + 24 = 34์› ์ž…๋‹ˆ๋‹ค.
    • 5→6 : A๊ฐ€ ํ˜ผ์ž ํƒ์‹œ๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์€ 2์› ์ž…๋‹ˆ๋‹ค.
    • 5→3→2 : B๊ฐ€ ํ˜ผ์ž ํƒ์‹œ๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์€ 24 + 22 = 46์› ์ž…๋‹ˆ๋‹ค.
    • A, B ๋ชจ๋‘ ๊ท€๊ฐ€ ์™„๋ฃŒ๊นŒ์ง€ ์˜ˆ์ƒ๋˜๋Š” ์ตœ์ € ํƒ์‹œ์š”๊ธˆ์€ 34 + 2 + 46 = 82์› ์ž…๋‹ˆ๋‹ค.

[๋ฌธ์ œ]

์ง€์ ์˜ ๊ฐœ์ˆ˜ n, ์ถœ๋ฐœ์ง€์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” s, A์˜ ๋„์ฐฉ์ง€์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” a, B์˜ ๋„์ฐฉ์ง€์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” b, ์ง€์  ์‚ฌ์ด์˜ ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์„ ๋‚˜ํƒ€๋‚ด๋Š” fares๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋•Œ, A, B ๋‘ ์‚ฌ๋žŒ์ด s์—์„œ ์ถœ๋ฐœํ•ด์„œ ๊ฐ๊ฐ์˜ ๋„์ฐฉ ์ง€์ ๊นŒ์ง€ ํƒ์‹œ๋ฅผ ํƒ€๊ณ  ๊ฐ„๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, ์ตœ์ € ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์„ ๊ณ„์‚ฐํ•ด์„œ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.
๋งŒ์•ฝ, ์•„์˜ˆ ํ•ฉ์Šน์„ ํ•˜์ง€ ์•Š๊ณ  ๊ฐ์ž ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์ด ๋” ๋‚ฎ๋‹ค๋ฉด, ํ•ฉ์Šน์„ ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

 

[์ œํ•œ์‚ฌํ•ญ]

  • ์ง€์ ๊ฐฏ์ˆ˜ n์€ 3 ์ด์ƒ 200 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ์ง€์  s, a, b๋Š” 1 ์ด์ƒ n ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ด๋ฉฐ, ๊ฐ๊ธฐ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์ž…๋‹ˆ๋‹ค.
    • ์ฆ‰, ์ถœ๋ฐœ์ง€์ , A์˜ ๋„์ฐฉ์ง€์ , B์˜ ๋„์ฐฉ์ง€์ ์€ ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • fares๋Š” 2์ฐจ์› ์ •์ˆ˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.
  • fares ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 2 ์ด์ƒ n x (n-1) / 2 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ๋“ค์–ด, n = 6์ด๋ผ๋ฉด fares ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 2 ์ด์ƒ 15 ์ดํ•˜์ž…๋‹ˆ๋‹ค. (6 x 5 / 2 = 15)
    • fares ๋ฐฐ์—ด์˜ ๊ฐ ํ–‰์€ [c, d, f] ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
    • c์ง€์ ๊ณผ d์ง€์  ์‚ฌ์ด์˜ ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์ด f์›์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
    • ์ง€์  c, d๋Š” 1 ์ด์ƒ n ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ด๋ฉฐ, ๊ฐ๊ธฐ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์ž…๋‹ˆ๋‹ค.
    • ์š”๊ธˆ f๋Š” 1 ์ด์ƒ 100,000 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • fares ๋ฐฐ์—ด์— ๋‘ ์ง€์  ๊ฐ„ ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์€ 1๊ฐœ๋งŒ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ฆ‰, [c, d, f]๊ฐ€ ์žˆ๋‹ค๋ฉด [d, c, f]๋Š” ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ถœ๋ฐœ์ง€์  s์—์„œ ๋„์ฐฉ์ง€์  a์™€ b๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

[์ž…์ถœ๋ ฅ ์˜ˆ]

n s a b fares result
6 4 6 2 [[4, 1, 10], [3, 5, 24], [5, 6, 2], [3, 1, 41], [5, 1, 24], [4, 6, 50], [2, 4, 66], [2, 3, 22], [1, 6, 25]] 82
7 3 4 1 [[5, 7, 9], [4, 6, 4], [3, 6, 1], [3, 2, 3], [2, 1, 6]] 14
6 4 5 6 [[2,6,6], [6,3,7], [4,6,7], [6,5,11], [2,5,12], [5,3,20], [2,4,8], [4,3,9]] 18

์ž…์ถœ๋ ฅ ์˜ˆ์— ๋Œ€ํ•œ ์„ค๋ช…

 

์ž…์ถœ๋ ฅ ์˜ˆ #1
๋ฌธ์ œ ์˜ˆ์‹œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ #2

  • ํ•ฉ์Šน์„ ํ•˜์ง€ ์•Š๊ณ , B๋Š” 3→2→1, A๋Š” 3→6→4 ๊ฒฝ๋กœ๋กœ ๊ฐ์ž ํƒ์‹œ๋ฅผ ํƒ€๊ณ  ๊ฐ€๋Š” ๊ฒƒ์ด ์ตœ์ € ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์ž…๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ตœ์ € ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์€ (3 + 6) + (1 + 4) = 14์› ์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ #3

  • A์™€ B๊ฐ€ 4→6 ๊ตฌ๊ฐ„์„ ํ•ฉ์Šนํ•˜๊ณ  B๊ฐ€ 6๋ฒˆ ์ง€์ ์—์„œ ๋‚ด๋ฆฐ ํ›„, A๊ฐ€6→5` ๊ตฌ๊ฐ„์„ ํ˜ผ์ž ํƒ€๊ณ  ๊ฐ€๋Š” ๊ฒƒ์ด ์ตœ์ € ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์ž…๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ตœ์ € ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์€ 7 + 11 = 18์› ์ž…๋‹ˆ๋‹ค.

ํ’€์ด

์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ทธ๋ž˜ํ”„ ๋‚ด์˜ ๋ชจ๋“  ๋…ธ๋“œ i์— ๋Œ€ํ•ด์„œ, 

s(์‹œ์ž‘์ง€์ ) ์—์„œ ์ž„์˜์˜ i ์ง€์ ๊นŒ์ง€ ํ•ฉ์Šนํ•œ ํ›„,

i ์ง€์ ๋ถ€ํ„ฐ A๋Š” a(A์˜ ์ง‘) ๊นŒ์ง€, B๋Š” b(B์˜ ์ง‘) ๊นŒ์ง€ ๋”ฐ๋กœ ๊ฐ€๋Š” ๊ธˆ์•ก์˜ ์ตœ์†Ÿ๊ฐ’ ๊ตฌํ•˜๊ธฐ 

  • ์ตœ๋Œ€ ๋…ธ๋“œ ๊ฐœ์ˆ˜๊ฐ€ 200 ์ดํ•˜์ด๋ฏ€๋กœ ๊ฐ€๋Šฅ 

ํ•˜์ง€๋งŒ ์œ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋ชจ๋“  ๋…ธ๋“œ i,j์— ๋Œ€ํ•ด ๋…ธ๋“œ i์—์„œ ๋…ธ๋“œ j๋กœ ๊ฐ€๋Š” ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•œ ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค. 

  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์šฉ 
    • ์šฐ์„ ์ˆœ์œ„ ํž™์„ ์ด์šฉํ•œ ๊ตฌํ˜„ : O(ElogV) (E: ๊ฐ„์„  ๊ฐœ์ˆ˜, V: ๋…ธ๋“œ ๊ฐœ์ˆ˜)

hub1234.tistory.com/33

 

C++ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„

์ด ๊ธ€์€ ๋‚˜๋™๋นˆ ๋‹˜์˜ '์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค' ์ฑ…์„ ๋ณด๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. https://book.naver.com/bookdb/book_detail.nhn?bid=16439154 ์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ IT ์ทจ์ค€์ƒ..

hub1234.tistory.com

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„์€ ์œ„์˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๋‹ค. 

 

์ฝ”๋“œ

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
#include <memory.h>
using namespace std;

#define MAXVAL 987654321

int min_route[200][200];
int N;
vector<pair<int,int>> adj[200];

void DijkstraHeap(){
    for (int start = 0; start<N;start++){
        priority_queue<pair<int, int>> pq;
        pq.push(make_pair(0,start));
        min_route[start][start] = 0;
        
        while(!pq.empty()) {
            int dist = -pq.top().first;
            int cur = pq.top().second;
            pq.pop();
            if (min_route[start][cur] < dist) continue; // ์ด๋ฏธ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ์ฒดํฌํ•œ ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ ํŒจ์Šค 
            
            for (int i=0;i<adj[cur].size();i++){
                int there = adj[cur][i].first;
                int cost = dist + adj[cur][i].second;
                if (cost < min_route[start][there]) {
                    min_route[start][there] = cost;
                    pq.push(make_pair(-cost, there));
                }
            }
        }
    }
    
}
int solution(int n, int s, int a, int b, vector<vector<int>> fares) {
    fill(&min_route[0][0],&min_route[n-1][n],MAXVAL);
    N = n;
    int answer = MAXVAL;
    for (int i=0;i<fares.size();i++){
        vector<int> temp = fares[i];
        adj[temp[0]-1].push_back(make_pair(temp[1]-1, temp[2]));
        adj[temp[1]-1].push_back(make_pair(temp[0]-1, temp[2]));
    }
    DijkstraHeap();
    
    for (int i=0;i<n;i++) {
        int both = min_route[s-1][i];
        int a_cost = min_route[i][a-1];
        int b_cost = min_route[i][b-1];
    
        if (both==MAXVAL || a_cost == MAXVAL || b_cost == MAXVAL)
            continue;
        int all_cost = both + a_cost + b_cost;
        if (all_cost < answer)
            answer = all_cost;
    }
    return answer;
}

 

๊ฐ ๋…ธ๋“œ๊ฐ„์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋งŒ ๊ตฌํ•˜๋ฉด, ๊ทธ ์ดํ›„๋Š” ๋งค์šฐ ์‰ฌ์šด ๋ฌธ์ œ์˜€๋‹ค. ์ตœ๋‹จ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฒ€์ƒ‰ ์—†์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค. 

๋ฐ˜์‘ํ˜•