codingtest

1956번 - 운동

2024-07-13
1분 분량
JAVA백준

문제 링크

문제 풀이 시간 : 10분

문제 요약

  • V 개의 마을과 E 개의 도로로 구성된 도시가 있다.
  • 도로를 따라 운동을 하기위한 경로를 찾는다.
  • 사이클을 찾되 길이의 합이 최소가 되도록 한다.
  • 경로를 찾을 수 없는 경우 -1을 출력한다.

문제 풀이

처음에는 각 마을 별로 모든 경로를 탐색해보면서 사이클이 있는지 없는지 확인하려고 했는데

그렇게 하면 너무 복잡하고 오히려 어려울 것 같아서 다른 방법을 생각했다.

그래서 생각한게 플로이드를 이용하는 것이다.

원래 플로이드에서는 자기 자신을 향하는 경로의 길이를 0으로 설정하지만

이 길이를 0이 아니라 무한대로 설정해둔다면?

모든 경로를 탐색하는 과정에서 사이클이 생기면 자기자신으로 가는 길이가 구해질 것이라고 생각했따.

그렇게 했더니 아주 쉽게 구할 수 있었따.

정답 코드

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


public class Main {
    public static long[][] cost;

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int V = Integer.parseInt(st.nextToken());
        int E = Integer.parseInt(st.nextToken());

        cost = new long[V + 1][V + 1];

        for(int i=1;i<=V;i++){
            for(int j=1;j<=V;j++){
                cost[i][j] = Integer.MAX_VALUE;
            }
        }

        for(int i=0;i<E;i++){
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());

            cost[a][b] = c;
        }

        for(int k=1;k<=V;k++){
            for(int i=1;i<=V;i++){
                for(int j=1;j<=V;j++){
                    cost[i][j] = Math.min(cost[i][j], cost[i][k] + cost[k][j]);
                }
            }
        }
        long ans = Integer.MAX_VALUE;
        for(int i=1;i<=V;i++){
            ans = Math.min(ans, cost[i][i]);
        }
        if(ans==Integer.MAX_VALUE)
            System.out.println(-1);
        else
            System.out.println(ans);
    }
}

함께 읽으면 좋은 글

코딩 테스트2026-04-02

5430번 - AC

함수 R은 배열을 뒤집는 연산 함수 D는 첫 번째 원소를 버리는 연산 단, 배열이 비어 있을 때 D를 수행하면 error 주어진 함수 문자열을 순서대로 수행한 뒤 최종 배열을 출력하는 문제 처음에는 문제 설명 그대로 R이 나올 때마다 배열을 실제로 뒤집고, D가 나오면 맨 앞…

코딩 테스트2026-04-02

1966번 - 프린터 큐

여러 문서가 큐에 들어 있고, 각 문서마다 중요도가 있음 맨 앞 문서를 확인했을 때, 더 높은 중요도의 문서가 뒤에 하나라도 있으면 맨 뒤로 보냄 그렇지 않으면 바로 인쇄 특정 위치의 문서가 몇 번째로 인쇄되는지 구하는 문제 이 문제는 프린터의 동작을 그대로 구현하면 되는…

코딩 테스트2026-03-29

1158 - 요세푸스 문제

1번부터 N번까지 사람이 원형으로 앉아 있음 순서대로 K번째 사람을 제거 모든 사람이 제거될 때까지 반복 제거되는 순서를 출력하는 문제 이 문제는 원형으로 순회하면서 K번째를 제거하는 과정을 그대로 구현하면 된다.

코딩 테스트2026-03-29

2164번 - 카드2

1부터 N까지 카드가 순서대로 쌓여 있음 맨 위 카드를 버리고, 그다음 맨 위 카드를 맨 아래로 옮기는 과정을 반복 마지막에 남는 카드 번호를 구하는 문제 이 문제는 규칙을 찾기보다, 문제에서 하라는 과정을 그대로 구현하면 된다. 카드 더미에서 반복되는 동작은 두 가지다.