알고리즘/SW Expert Academy

1263. [S/W 문제해결 응용] 8일차 - 사람 네트워크2

Junuuu 2022. 5. 20. 00:01
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV18P2B6Iu8CFAZN 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제 해석

네트워크 상에서 한 사용자가 다른 모든 사람에게 얼마나 가까운가를 구합니다.

이를 CC라고 칭하고 해당 값을 가장 작게 가지는 사람을 출력합니다.

CC(i) = ∑ j dist(i,j)dist(i, j) 단, dist(i, j)는 노드 i로부터 노드 j까지의 최단 거리이다.

 

문제 해석

모든 순서쌍에 대하여 최단경로를 구해야 합니다.

다익스트라 or 플로이드 와샬 알고리즘을 사용하면 됩니다.

사람의 수도 1000이기 때문에 1000 x 1000을 인접행렬로 잡아도 메모리에 무리가 없을 것으로 판단했습니다.

 

 

해당 풀이는 플로이드 와샬 알고리즘을 활용해 보았습니다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Solution_사람네트워크2 {

    static final int INF = 100_000_000;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();
        int result = 0;
        int[][] dp = null;
        int[][] edges = null;
        StringTokenizer st = null;
        for(int tc=1 ;tc<=T; tc++){
            st = new StringTokenizer(br.readLine()," ");
            int n = Integer.parseInt(st.nextToken());
            dp = new int[n+1][n+1];

            for(int i=1; i<n+1; i++){
                for(int j=1; j<n+1; j++){
                    int tempValue = Integer.parseInt(st.nextToken());

                    if(tempValue == 0 || i==j ){
                        dp[i][j]= INF;
                        continue;
                    }
                    dp[i][j] = tempValue;
                }
            }
            //입력 끝

            //1~n번 반복  i = 거쳐가는 노드
            for(int i=1; i<n+1; i++){
                //dp배열 갱신
                for(int j=1; j<n+1; j++){
                    if(i==j) continue;
                    for(int k=1; k<n+1; k++){
                        if(j==k || i == k ) continue;
                        dp[j][k] = Math.min(dp[j][k] , dp[j][i] + dp[i][k]);
                    }
                }
            }

            result = Integer.MAX_VALUE;
            for(int i=1; i<n+1; i++){
                int sum = 0;
                for(int j=1; j<n+1; j++){
                    if(dp[i][j] == INF) continue;
                    sum+= dp[i][j];
                }
                result = Math.min(result,sum);
            }

            sb.append("#"+ tc + " " + result + "\n");
        }
        System.out.println(sb.toString());
    }
}