백준 13424 java

magicdrill·2024년 10월 28일

백준 문제풀이

목록 보기
474/675

백준 13424 java

플로이드 워셜 알고리즘을 사용해 주어진 모든 점에서 이동하는 거리의 합을 최소로 할 수 있는 도착지 점을 찾는 문제다.
처음 풀이에서 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;
    }
}

0개의 댓글