๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋ฌธ์ œํ’€์ด

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

by alswlfl 2026. 7. 25.

[ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ]-ํ•ฉ์Šน ํƒ์‹œ ์š”๊ธˆ

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก์˜ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

 

๋ฌธ์ œ ์„ค๋ช…

๋‘ ์‚ฌ๋žŒ์ด s์—์„œ ์ถœ๋ฐœํ•ด์„œ ๊ฐ๊ฐ์˜ ๋„์ฐฉ ์ง€์ ๊นŒ์ง€ ํƒ์‹œ๋ฅผ ํƒ€๊ณ  ๊ฐ„๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, ์ตœ์ € ์˜ˆ์ƒ ํƒ์‹œ ์š”๊ธˆ return

  • ์•„์˜ˆ ํ•ฉ์Šนํ•˜์ง€ ์•Š๊ณ  ๊ฐ์ž ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์˜ˆ์ƒ ํƒ์‹œ์š”๊ธˆ์ด ๋” ๋‚ฎ๋‹ค๋ฉด, ํ•ฉ์Šนํ•˜์ง€ ์•Š์•„๋„ ๋จ
  • 3 ≤ n ≤ 200
  • 1 ≤ s, a, b ≤ n

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

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

 

ํ’€์ด ๋ฐฉ๋ฒ•

์ฒ˜์Œ ์ ‘๊ทผํ•œ ๋ฐฉ์‹

‘๋ฌด์ง€ + ์–ดํ”ผ์น˜ = ํƒ์‹œ ์š”๊ธˆ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ’ ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•ด์„œ S์—์„œ A ํ˜น์€ B๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋ฉด์„œ ๋™์‹œ์— ๊ทธ ์ตœ๋‹จ ๊ฒฝ๋กœ๊นŒ์ง€ ๊ฐ€๋Š” ๋ฃจํŠธ๋ฅผ ๊ตฌํ•˜๋ ค๊ณ  ํ–ˆ์Œ

์ตœ๋‹จ ๊ฒฝ๋กœ๊นŒ์ง€ ๊ฐ€๋Š” ๋ฃจํŠธ ์ค‘ ๊ฒน์น˜๋Š” ๋ฃจํŠธ๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ๋นผ์ฃผ๋ ค๊ณ  ํ–ˆ์Œ

์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐ๊ฐ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ข…์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ํƒ์‹œ ์š”๊ธˆ์˜ ์ตœ์†Œ ๊ฐ’์„ ์ œ๋Œ€๋กœ ๊ตฌํ•  ์ˆ˜ ์—†์Œ

⇒ ๊ฒฐ๊ตญ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•˜๊ฒŒ ๋์Œ…

ํ’€์ด ์ฐธ๊ณ  ๋ฐฉ์‹

์ด ๋ฌธ์ œ๋Š” S์—์„œ ์‹œ์ž‘ํ•ด์„œ ์–ด๋–ค ๋ฃจํŠธ๋ฅผ ๊ฑฐ์ณ์„œ ์ตœ์ข… ๋ชฉ์ ์ง€์— ๋„๋‹ฌํ•˜๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋–ค ๋ฃจํŠธ์˜ ๋ถ€๋ถ„์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ์ •์ ์—์„œ ๋‹ค๋ฅธ ์ •์ ๊นŒ์ง€์˜ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด์•ผ ํ•จ!

ํ˜„์žฌ N์˜ ์ตœ๋Œ€๊ฐ€ 200์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O($N^3$) = ๋Œ€๋žต O($200^3$) = 8000000์ž„

  1. ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด์„œ ๋ชจ๋“  ์ •์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•จ
  2. ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ
    1. ์„œ๋กœ ๋”ฐ๋กœ ํƒ์‹œ๋ฅผ ํƒ€๊ณ  ๊ฐ€๋Š” ๊ฒฝ์šฐ → route[s][a] + route[s][b]
    2. ํŠน์ • ์ง€์ ์„ ๊ฒฝ์œ ํ•ด์„œ ๊ฐ์ž์˜ ๋ชฉ์ ์ง€๋กœ ๊ฐ€๋Š” ๊ฒฝ์šฐ → route[s][k] + route[k][a] + route[k][b]
  3. ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ•œ ๊ฒƒ ์ค‘์— ์ตœ์†Œ ๊ฐ’์„ ์ฐพ์œผ๋ฉด ๋จ

์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ๋ฅผ ์ด์šฉํ•ด ํ’€์–ด๋ณด๋ฉด,

1. ์ฃผ์–ด์ง„ fares๋ฅผ ํ†ตํ•ด ํ…Œ์ด๋ธ” ์ฑ„์šฐ๊ธฐ(์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ๋ถ€๋ถ„์€ INF๋กœ ์ฑ„์šฐ๊ธฐ)

2. ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์šฉํ•ด์„œ ๋ชจ๋“  ์ •์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ตฌํ•˜๊ธฐ

 

3. ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ํƒ์‹œ ์š”๊ธˆ ๊ตฌํ•˜๊ธฐ

3-1) ์„œ๋กœ ํƒ์‹œ๋ฅผ ๋”ฐ๋กœ ํƒ€๋Š” ๊ฒฝ์šฐ: route[4][6] + route[4][2] = 35 + 66 = 101

3-2) ํŠน์ • ๋ฃจํŠธ๋ฅผ ๊ฒฝ๋กœํ•ด์„œ ๊ฐ์ž์˜ ๋ชฉ์ ์ง€๋กœ ๊ฐ€๋Š” ๊ฒฝ์šฐ

  • 1๋ฒˆ ๋ฃจํŠธ ๋“ค๋ ธ๋‹ค ๊ฐ€๋Š” ๊ฒฝ์šฐ: route[4][1] + route[1][6] + route[1][2] = 10 + 25 + 63 = 98
  • 2๋ฒˆ ๋ฃจํŠธ ๋“ค๋ ธ๋‹ค ๊ฐ€๋Š” ๊ฒฝ์šฐ: route[4][2] + route[2][6] + route[2][2] = 66 + 48 + 0 = 114
  • 3๋ฒˆ ๋ฃจํŠธ ๋“ค๋ ธ๋‹ค ๊ฐ€๋Š” ๊ฒฝ์šฐ: route[4][3] + route[3][6] + route[3][2] = 51 + 26 + 22 = 99
  • 4๋ฒˆ ๋ฃจํŠธ ๋“ค๋ ธ๋‹ค ๊ฐ€๋Š” ๊ฒฝ์šฐ: route[4][4] + route[4][6] + route[4][2] = 101 ⇒ ์„œ๋กœ ํƒ์‹œ๋ฅผ ๋”ฐ๋กœ ํƒ€๋Š” ๊ฒฝ์šฐ์™€ ๋™์ผํ•จ
  • 5๋ฒˆ ๋ฃจํŠธ ๋“ค๋ ธ๋‹ค ๊ฐ€๋Š” ๊ฒฝ์šฐ: route[4][5] + route[5][6] + route[5][2] = 34 + 2 + 46 = 82
  • 6๋ฒˆ ๋ฃจํŠธ ๋“ค๋ ธ๋‹ค ๊ฐ€๋Š” ๊ฒฝ์šฐ: route[4][6] + route[6][6] + route[6][2] = 35 + 0 + 48 = 83

์ฝ”๋“œ

import java.util.*;

class Solution {
    static int INF = Integer.MAX_VALUE;
    public int solution(int n, int s, int a, int b, int[][] fares) {
        
        // ๋ชจ๋“  ์ •์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•  ํ…Œ์ด๋ธ” ์ฑ„์šฐ๊ธฐ
        int[][] route = new int[n+1][n+1];
        for(int r=1; r<=n; r++) {
            for(int c=1; c<=n; c++) {
                // ๋ณธ์ธ ์ •์ ์ด๋ฉด 0์œผ๋กœ ์„ค์ •, ๊ทธ ์™ธ์—๋Š” INF๋กœ ์ดˆ๊ธฐํ™”
                if(r != c) route[r][c] = INF;
            }
        }
        // ์—ฐ๊ฒฐ๋œ ๊ฒฝ๋กœ ํ‘œ์‹œ
        for(int[] fare : fares) {
            route[fare[0]][fare[1]] = fare[2];
            route[fare[1]][fare[0]] = fare[2];
        }
        
        // ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰
        for(int k=1; k<=n; k++) {
            for(int r=1; r<=n; r++) {
                for(int c=1; c<=n; c++) {
                    if(r == c) continue;
                    if(route[r][k] == INF || route[k][c] == INF) continue;
                    route[r][c] = Math.min(route[r][c], route[r][k] + route[k][c]);
                }
            }
        }
        
        int answer = INF;
        // ์„œ๋กœ ๊ฐ์ž ๊ฐ€๋Š” ๊ฒฝ์šฐ์™€ ํŠน์ • ๊ฒฝ๋กœ๋ฅผ ๊ฒฝ์œ ํ•ด์„œ ๊ฐ€๋Š” ๊ฒฝ์šฐ ์ค‘ ์ตœ์†Œ ๋น„์šฉ ๊ตฌํ•˜๊ธฐ
        for(int mid=1; mid<=n; mid++) {
            int cost = route[s][mid] + route[mid][a] + route[mid][b];
            
            answer = Math.min(answer, cost);
        }
        
        
        return answer;
    }
}