์•Œ๊ณ ๋ฆฌ์ฆ˜/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

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

KIMHYEYUN 2021. 9. 30. 18:59
๋ฐ˜์‘ํ˜•

https://programmers.co.kr/learn/courses/30/lessons/72413

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ํ•ฉ์Šน ํƒ์‹œ ์š”๊ธˆ

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

programmers.co.kr

 

๋ฌธ์ œ


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

์œ„ ์˜ˆ์‹œ ๊ทธ๋ฆผ์€ ํƒ์‹œ๊ฐ€ ์ด๋™ ๊ฐ€๋Šฅํ•œ ๋ฐ˜๊ฒฝ์— ์žˆ๋Š” 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๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

ํ’€์ด


2๏ธโƒฃ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€์–ด๋ดค๋”ฐโ€ผ๏ธ ์ฒ˜์Œ์—๋Š” Floyd-Warshall ๋กœ ํ’€์—ˆ๋Š”๋ฐ, Dijkstra๋กœ๋„ ํ’€ ์ˆ˜ ์žˆ์„ ๊ฑฐ ๊ฐ™์•„์„œ ์ฐธ๊ณ ๋ฅผ ํ†ตํ•˜์—ฌ ๊ตฌํ˜„๐Ÿคฆ‍โ™€๏ธ

https://hyeyun.tistory.com/entry/Algorithm-ํ”Œ๋กœ์ด๋“œ-์™€์ƒฌ-Floyd-Warshall-์•Œ๊ณ ๋ฆฌ์ฆ˜

 

[ Algorithm ] ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ ( Floyd-Warshall) ์•Œ๊ณ ๋ฆฌ์ฆ˜

Floyd-Warshall ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€ ? Floyd-Warshall ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€, ๋ณ€์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์Œ์ด๊ฑฐ๋‚˜ ์–‘์ธ ( ์Œ์ˆ˜ ์‚ฌ์ดํด์€ ์—†๋Š” ) ๊ฐ€์ค‘ ๊ทธ๋ž˜ํ”„์—์„œ ๋ชจ๋“  ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์ด๋‹ค. ๋‹ค์ต์ŠคํŠธ๋ผ์™€ ๋ฒจ๋งŒํฌ๋“œ ์•Œ๊ณ ๋ฆฌ

hyeyun.tistory.com

1๏ธโƒฃ Floyd-Warshall 

 ๐Ÿ‘‰ answer๋ฅผ ํ•ฉ์Šนํ•˜์ง€ ์•Š๊ณ  ๊ฐ€๋Š” ๊ธˆ์•ก์œผ๋กœ ์ดˆ๊ธฐํ™” ํ›„, ๊ฐ ์ง€์  k ๊นŒ์ง€ ํ•ฉ์Šน + k์—์„œ a + k์—์„œ b ์˜ ๊ธˆ์•ก๊ณผ ๋น„๊ตํ•ด์„œ ๊ฐ’์„ ๊ตฌํ–ˆ๋‹ค

2๏ธโƒฃ Dijkstra

 ๐Ÿ‘‰ costA ๋ฐฐ์—ด : ๊ฐ ์ง€์  c -> a ๋กœ ๊ฐ€๋Š” ์ตœ์†Œ ๊ธˆ์•ก

 ๐Ÿ‘‰ costB ๋ฐฐ์—ด : ๊ฐ ์ง€์  c -> b ๋กœ ๊ฐ€๋Š” ์ตœ์†Œ ๊ธˆ์•ก

 ๐Ÿ‘‰ costS ๋ฐฐ์—ด : s -> ๊ฐ ์ง€์  c ๋กœ ๊ฐ€๋Š” ์ตœ์†Œ ๊ธˆ์•ก

์„ dijkstra ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ตฌํ•ด์ฃผ๊ณ  ๊ฐ ์ธ๋ฑ์Šค์—์„œ์˜ ํ•ฉ์ด ๊ฐ€์žฅ ์ ์€ ๊ฐ’์œผ๋กœ ๊ตฌํ•ด์ฃผ์—ˆ๋‹ค

์ •ํ™•์„ฑ ์ธก๋ฉด์—์„œ๋Š” Floyd-Warshall ์Šนโ€ผ๏ธ

ํšจ์œจ์„ฑ ์ธก๋ฉด์—์„œ๋Š” Dijkstra ์Šนโ€ผ๏ธ

์ฝ”๋“œ


1๏ธโƒฃ Floyd-Warshall

    public static int solutionFloyd(int n, int s, int a, int b, int[][] fares) {
        
        int[][] floyd = new int[n+1][n+1];
        for(int i = 1 ; i < n+1 ; i++){
            for(int j = 1; j < n+1; j++){
                floyd[i][j] = 20000001;
            }
            floyd[i][i] = 0;
        }

        for(int[] f : fares){
            floyd[f[0]][f[1]] = f[2];
            floyd[f[1]][f[0]] = f[2];
        }

        for(int k = 1 ; k < n+1 ; k++){
            for(int i = 1; i < n+1; i++){
                for(int j = 1 ; j < n+1 ; j++){
                    if(floyd[i][j] > floyd[i][k] + floyd[k][j]){
                        floyd[i][j] = floyd[i][k] + floyd[k][j];
                    }
                }
            }
        }

        int ans = floyd[s][a] + floyd[s][b];
        for(int k = 1; k < n+1 ; k++){
            ans = Math.min(ans, floyd[s][k] + floyd[k][a] + floyd[k][b]);
        }

        return ans;
    }

 

2๏ธโƒฃ Dijkstra 

 static class edge implements Comparable<edge>{
        int index;
        int cost;

        edge(int index, int cost){
            this.index = index;
            this.cost = cost;
        }

        @Override
        public int compareTo(edge o) {
            // TODO Auto-generated method stub
            return this.cost - o.cost;
        }
    }

    static ArrayList<edge>[] graph;
    public static int solutionDijkstra(int n, int s, int a, int b, int[][] fares) {
        int answer = Integer.MAX_VALUE;

        graph = new ArrayList[n+1];
        for(int i = 0 ; i < n+1 ; i++){
            graph[i] = new ArrayList<>();
        }

        for(int[] f : fares){
            graph[f[0]].add(new edge(f[1], f[2]));
            graph[f[1]].add(new edge(f[0], f[2]));
        }

        int[] costA = new int[n+1];    // c -> a ๋ณ„ ๊ธˆ์•ก
        int[] costB = new int[n+1];    // c -> b ๋ณ„ ๊ธˆ์•ก
        int[] costS = new int[n+1];     // s -> c ๋ณ„ ๊ธˆ์•ก

        costA = dijkstra(a, costA);
        costB = dijkstra(b, costB);
        costS = dijkstra(s, costS);

        for(int i = 1; i < n+1; i++){
            answer = Math.min(answer, costA[i] + costB[i] + costS[i]);
        }

        return answer;
    }

    private static int[] dijkstra(int index, int[] cost) {
        PriorityQueue<edge> pq = new PriorityQueue<>();
        pq.offer(new edge(index, 0));
        Arrays.fill(cost, 200000001);
        cost[index] = 0;

        while(!pq.isEmpty()){
            edge now = pq.poll();

            for(edge next : graph[now.index]){
                if(cost[next.index] > cost[now.index] + next.cost){
                    cost[next.index] = cost[now.index] + next.cost;
                    pq.offer(next);
                }
            }
        }

        return cost;
    }
728x90
๋ฐ˜์‘ํ˜•