백준 1719 java

magicdrill·2024년 10월 16일

백준 문제풀이

목록 보기
465/673

백준 1719 java

플로이드 워셜 또는 다익스트라로 풀이한다. 다익스트라도 다시 연습하겠다.
처음에 routeData를 초기화할때 직접적인 길이 없다는 의미로 1001로 초기화를 했다. 이때 만약 비용이 1000, 1000이라서 합이 1001 이상이라 경유하는 길이 있어도 갱신이 안되는 문제가 있었다. 좀 더 큰 값으로 바꿔 해결했다.

import java.util.Arrays;
import java.util.Scanner;

import static java.lang.Math.min;

public class bj1719 {
    static Scanner scanner = new Scanner(System.in);
    static int[][] routeData;
    static int[][] map;
    static int INF = 200 * 100001;

    public static void main(String[] args) {
        inputData();
        findAnswer();

        scanner.close();
    }

    public static void inputData(){
        System.out.println("inputData()");
        int n, m;
        int i, j, a, b, time;

        n = scanner.nextInt();
        m = scanner.nextInt();
        routeData = new int[n+1][n+1];
        map = new int[n+1][n+1];

        for(i = 1; i < routeData.length; i++)// 전체 초기화
        {
            Arrays.fill(routeData[i], INF);//전체 초기화 하는 법
        }
        for(i = 1; i < routeData.length; i++)//자기 자신으로 가는 경로 초기화
        {
            routeData[i][i] = 0;
        }

        for(i = 1; i < map.length; i++)//i번에서 j번으로 처음 접근하는 방법은 j이다.
        {
            for(j = 1; j < map[i].length; j++)
            {
                map[i][j] = j;
            }
        }
        for(i = 1; i < map.length; i++)//자기 자신으로 가는 경로 초기화
        {
            map[i][i] = 0;
        }

        for(i = 0; i < m; i++)//입력
        {
            a = scanner.nextInt();
            b = scanner.nextInt();
            time = scanner.nextInt();
            routeData[a][b] = time;
            routeData[b][a] = time;//양방향 저장
        }

        System.out.println("입력 결과");
        System.out.println("routeData");
        for(i = 1; i < routeData.length; i++) {
            for (j = 1; j < routeData[i].length; j++) {
                System.out.print(routeData[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println("map");
        for(i = 1; i < map.length; i++) {
            for (j = 1; j < map[i].length; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
    }

    public static void findAnswer(){
        System.out.println("findAnswer()");
        int i, j, k, temp;

        System.out.println("플로이드 워셜 수행");
        for(k = 1; k < routeData.length; k++)
        {
            for(i = 1; i < routeData.length; i++)
            {
                for(j = 1; j < routeData.length; j++)
                {
                    temp = routeData[i][k] + routeData[k][j];
                    if(routeData[i][j] > temp)
                    {
                        routeData[i][j] = temp;
                        map[i][j] = map[i][k];
                    }
                }
            }
        }

        System.out.println("플로이드 워셜 수행 결과 routeData");
        for(i = 1; i < routeData.length; i++) {
            for (j = 1; j < routeData[i].length; j++) {
                System.out.print(routeData[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println();

        System.out.println("플로이드 워셜 수행 결과 map");
        for(i = 1; i < map.length; i++) {
            for (j = 1; j < map[i].length; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println();

        for(i = 1; i < map.length; i++) {
            for (j = 1; j < map[i].length; j++) {
                if(i == j)
                {
                    System.out.print("- ");
                }
                else
                {
                    System.out.print(map[i][j] + " ");
                }
            }
            System.out.println();
        }
    }
}

0개의 댓글