알고리즘/알문풀(백준, 프로그래머스, 코드트리)

[알고리즘] BOJ 11265 끝나지 않는 파티 (JAVA)

ragabys 2024. 5. 28. 12:58

https://www.acmicpc.net/problem/11265

 

 

백준 골드5로 난이도가 설정된 문제였다.

 

 

문제 지문에서 잡다한 내용을 다 빼고 보자면, 결국 A -> B 이동시 C 시간 이내로 올 수 있는지 없는지 출력해주면 된다는 것이었다.

 

 

도로는 일방통행이고, A와 B는 1 이상 N 이하의 모든 값이 될 수 있기 때문에

 

 

모든 정점에 대해 최단거리를 구하는 플로이드워셜 알고리즘을 사용했다.

 

 

보통의 플로이드워셜 문제가 INF 값을 임의로 설정하고 최단거리를 구하는 방식으로 구하는 반면에,

 

 

이 문제는 모든 정점 간의 거리가 입력으로 주어져서 딱히 그럴 필요가 없었다.

 

 

import java.io.*;
import java.util.*;

public class boj11265 {
    static int N, M, A, B, C;
    static int dist[][];
    static StringBuilder sb;

    public static void FLoydWrasahll() {
        for (int k = 1; k <= N; k++) {
            for (int i = 1; i <= N; i++) {
                for (int j = 1; j <= N; j++) {
                    dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
                }
            }
        }
    }

    public static void pre() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        sb = new StringBuilder();

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        dist = new int[N + 1][N + 1];

        for (int i = 1; i <= N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 1; j <= N; j++) {
                dist[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        FLoydWrasahll();

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());

            A = Integer.parseInt(st.nextToken());
            B = Integer.parseInt(st.nextToken());
            C = Integer.parseInt(st.nextToken());

            sb.append(dist[A][B] <= C ? "Enjoy other party" : "Stay here").append('\n');
        }
    }

    public static void main(String args[]) throws IOException {
        pre();
        System.out.print(sb);
    }
}

 

 

해당 코드의 실행 시간은 다음과 같다.

 

 

무난한 플로이드워셜 알고리즘 문제였다.