

플로이드 워셜 알고리즘을 사용해 주어진 모든 점에서 이동하는 거리의 합을 최소로 할 수 있는 도착지 점을 찾는 문제다.
처음 풀이에서 inputData() 함수에서 배열 내부를 채우는
Arrays.fill(secretRoute[i], 1001);
이 부분이 문제였다.
여기서 1001은 직접 가는 길이 없다는 뜻으로 문제 요구조건의 경계값을 넣은 건데 거쳐가는 값으로 600, 600이 나오면 요구조건을 맞추면서도 1001보다 큰 값이 되어 1001을 길이 있는 것으로 만들 수가 있다. 그래서 100*1000의 값으로 바꾸어 오류를 수정했다.
import java.util.Arrays;
import java.util.Scanner;
public class bj13424 {
static Scanner scanner = new Scanner(System.in);
static int[][] secretRoute;
static int [] friendRoom;
public static void main(String[] args) {
int T, i;
T = scanner.nextInt();
for(i = 0; i < T; i++)
{
inputData();
System.out.println(findAnwser());
}
scanner.close();
}
public static void inputData() {
System.out.println("\ninputData()");
int N, M, K;
int a, b, c;
int i;
N = scanner.nextInt();
M = scanner.nextInt();
secretRoute = new int[N + 1][N + 1];
for(i = 1; i < secretRoute.length; i++)
{
Arrays.fill(secretRoute[i], 100000);//<= 여기 문제였음
secretRoute[i][i] = 0;
}
for(i = 0; i < M; i++)
{
a = scanner.nextInt();
b = scanner.nextInt();
c = scanner.nextInt();
secretRoute[a][b] = c;
secretRoute[b][a] = c;
}
K = scanner.nextInt();
friendRoom = new int[K];
for(i = 0; i < friendRoom.length; i++)
{
friendRoom[i] = scanner.nextInt();
}
System.out.println("입력결과");
for(i = 1; i < secretRoute.length; i++)
{
for(int temp : secretRoute[i])
{
System.out.print(temp + " ");
}
System.out.println();
}
for(int temp : friendRoom)
{
System.out.print(temp + " ");
}
System.out.println();
}
public static int findAnwser()
{
System.out.println("\nfindAnswer()");
int answer = 0;
floydWarshall();
answer = findRoomNum();
return answer;
}
public static void floydWarshall(){
System.out.println("\nfloydWarshall()");
int i, j, k, N = secretRoute.length;
for(k = 1; k < N; k++)
{
for(i = 1; i < N; i++)
{
for(j = 1; j < N; j++)
{
secretRoute[i][j] = Math.min(secretRoute[i][j], secretRoute[i][k] + secretRoute[k][j]);
}
}
}
System.out.println("플로이드 워셜 결과");
for(i = 1; i < N; i++)
{
for(j = 1; j < N; j++)
{
System.out.print(secretRoute[i][j] + " ");
}
System.out.println();
}
}
public static int findRoomNum(){
System.out.println("findRoomNum()");
int minimumSum = Integer.MAX_VALUE;
int i, N = secretRoute.length;
int currentSum, roomNum = N;
//현재 친구들이 있는 방에서 최소 합으로 이동할 수 있는 모임 장소의 방번호
//총합을 구하는게 아니야. 방번호를 구하는거야
for(i = N - 1; i > 0; i--)
{
currentSum = 0;
for(int friend : friendRoom)
{
currentSum += secretRoute[friend][i];
}
if(currentSum <= minimumSum)
{
minimumSum = currentSum;
roomNum = i;
}
System.out.println("roomNum = " + roomNum);
}
return roomNum;
}
}