운동(백준_1956)

2023. 2. 22. 00:23·BackEnd/알고리즘 공부

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

 

1956번: 운동

첫째 줄에 V와 E가 빈칸을 사이에 두고 주어진다. (2 ≤ V ≤ 400, 0 ≤ E ≤ V(V-1)) 다음 E개의 줄에는 각각 세 개의 정수 a, b, c가 주어진다. a번 마을에서 b번 마을로 가는 거리가 c인 도로가 있다는 의

www.acmicpc.net

 

문제 설명

1번 부터 V번까지 번호가 매겨져 있는 마을에서 운동을 하기 위해 경로를 찾으려고 한다.

운동을 한 후에 다시 시작점으로 돌아오는 코스를 짤 때, 도로 길이의 합이 최소가 되도록 찾아라!!

구해야하는 것을 정리해 보면

  • 싸이클을 찾아라
  • 그 때, 도로의  합은 최소여야 한다.

이 정도이다.

 

문제에 대한 아이디어

일단 이 문제를 보고 처음 든 생각은 다익스트라를 사용할까 였다. 하지만 이 문제는 1 : N이 아니다.

하나의 출발점에서 다른 여러 지점으로 가는 최소 비용을 찾는것이 아니라 모든 지점에서 모든 지점으로 갈 때, 최소 비용을 찾는 것이다. 즉 N : N 방법일 때 쓰는 플로이드 워셜 알고리즘을 사용해야 한다!!

 

플로이드 워셜 알고리즘으로 문제해결하기!!

기본적인 플로이드 워셜 알고리즘처럼 이차원 배열을 만든 뒤 3차 for문을 돌면서 

arr[처음][마지막] >= arr[처음][중간] + arr[중간][마지막]을 검사한다. 이렇게 하면 그 지점까지 가는 최소 비용을 찾을 수 있다. 즉, arr[1][2] 는 1에서 2로갈때 최소 비용이다.

 

그럼 싸이클은 어떻게 확인할수 있을까?

arr[1][2]가 제일처음 지정한 숫자가 아니라 최소 비용으로 되어 있을 때, arr[2][1] 도 최소 비용으로 되어 있는지 검사하는 것이다. 왜냐하면 어떤 경로로 가든 arr[1][2]는 1에서 2를 간것이고 arr[2][1]은 2에서 1로 갈 수 있다는 것이다.

즉, 싸이클이 형성된다. 그러므로 우리는 이것만 조사해보면 된다.

 

구현

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

public class 백준_1956 {
    static int arr[][];
    public static void main(String[] args) throws IOException {
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(buf.readLine());
        int v = Integer.parseInt(st.nextToken());
        int e = Integer.parseInt(st.nextToken());
        arr = new int[v+1][v+1];
        for(int i = 0; i<=v; ++i){
            for(int j = 0; j<=v; ++j){
                if(i == j) arr[i][j] = 0;
                else arr[i][j] = 987654321;
            }
        }
        for(int i =0; i<e; ++i){
            st = new StringTokenizer(buf.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            arr[a][b] = c;
        }
        //플로이드 워셜 알고리즘
        for(int m = 1; m <= v; ++m){
            for(int s = 1; s<=v; ++s){
                for(int en = 1; en <=v; ++ en){
                    if(arr[s][en] >= arr[s][m] + arr[m][en]){
                        arr[s][en] = arr[s][m] + arr[m][en];
                    }
                }
            }
        }
        //이차원 배열을 돌면서 cycle인지 검사한다
        int result = 987654321;
        for(int i = 1; i<=v; ++i){
            for(int j =1; j<=v; ++j){
                if(arr[i][j] != 987654321 && arr[j][i] != 987654321 && i!=j){
                    result = Math.min(result, arr[i][j] + arr[j][i]);
                }
            }
        }
        if(result == 987654321){
            System.out.println(-1);
        }
        else System.out.println(result);
    }
}

 

https://github.com/Heron-Woong/CodingTest_Practice/commit/810544dca4ac47744cb23765aea563d167d61c2a

 

백준_1956, 운동 · Heron-Woong/CodingTest_Practice@810544d

Showing 1 changed file with 49 additions and 0 deletions.

github.com

 

'BackEnd > 알고리즘 공부' 카테고리의 다른 글

파괴되지 않은 건물(프로그래머스) JAVA  (0) 2023.02.27
등산코스 정하기(프로그래머스) JAVA  (0) 2023.02.22
사회망 서비스(SNS)(백준_2533)  (0) 2023.02.19
선분 교차 2(백준_17387)  (0) 2023.02.18
가장 긴 증가하는 부분 수열 5(백준_14003)  (0) 2023.02.15
'BackEnd/알고리즘 공부' 카테고리의 다른 글
  • 파괴되지 않은 건물(프로그래머스) JAVA
  • 등산코스 정하기(프로그래머스) JAVA
  • 사회망 서비스(SNS)(백준_2533)
  • 선분 교차 2(백준_17387)
인프라 감자
인프라 감자
  • 인프라 감자
    삶은 인프라
    인프라 감자
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • 클라우드&인프라 (28)
        • 인프라 공부 (4)
        • AWS 구조와 서비스 (18)
        • 클라우드 공부 (4)
        • Terraform (2)
      • AWS Cloud School (13)
        • project (5)
        • Linux, Network (6)
        • Docker (2)
      • BackEnd (162)
        • JAVA 공부 (15)
        • 알고리즘 공부 (71)
        • MySQL 문제 풀기 (8)
        • 스프링 핵심 원리 - 기본편 (18)
        • 스프링 MVC 1편 (4)
        • 자바 ORM 표준 JPA 프로그래밍 (21)
        • 실전! 스프링 부트와 JPA 활용1 (8)
        • 실전! 스프링 부트와 JPA 활용2 (5)
        • 스프링 데이터 JPA (8)
        • Querydsl (4)
      • 혼자하는 프로젝트 (32)
        • 배달의 민족 클론코딩 (7)
        • 나만의 프로젝트 (10)
        • 스프링 부트로 구현한 웹 (15)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Email
    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    네트워크 기본 용어
    linux
    중첩 선언
    완전탐색
    프로그래머스
    dp
    상속
    디팬스 게임
    자바
    이것이 자바다
    백트래킹
    querydsl
    정렬
    유니온 파인드
    조합
    자동 배포
    VPN
    다이나믹 프로그래밍
    쿼드 압축
    스프링 핵심 원리-기본편
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
인프라 감자
운동(백준_1956)
상단으로

티스토리툴바