developer-ellen
인간 디버거의 로그 찍기
developer-ellen
전체 방문자
오늘
어제
  • 분류 전체보기 (217)
    • 회고록 (0)
    • 취뽀 및 커리어 여정의 Stack (2)
      • SSAFY 7기 (2)
    • 프로그래밍공부 (24)
      • c++ (0)
      • JAVA (3)
      • Spring (5)
      • design pattern (3)
      • BackDB (1)
      • Servlet&JSP (3)
      • Vue (4)
      • JPA (4)
      • Infra (1)
      • Linux (0)
    • AI (3)
      • papers (3)
      • trend (0)
    • 프로젝트진행 (0)
      • 데이터베이스 (0)
      • 서버개발 (0)
      • 인공지능 (0)
      • 하루정리 (0)
    • 포트폴리오 (0)
    • 알고리즘 (158)
      • 알고리즘문풀 (155)
      • 알고리즘공부 (3)
    • 통계공부 (15)
      • 시계열분석 (15)
      • 회귀분석 (0)
    • CS (14)
      • 컴퓨터네트워크 (4)
      • 운영체제 (8)
      • 데이터베이스 (2)
    • 주저리주저리 (0)
      • 필사 (0)
    • 취업관련정보 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 삼성코테파이썬풀이
  • 카카오코테java풀이
  • Arima
  • 삼성코테파이썬
  • MA모형
  • SW역량테스트파이썬
  • 통계학
  • 삼성코테구현풀이
  • SW역량테스트파이썬풀이
  • 코테파이썬
  • 시계열
  • c++ 빌더 패턴
  • c++디자인패턴
  • 삼성코테자바준비
  • BOJ파이썬풀이
  • 백준파이썬풀이
  • 삼성코테자바꿀팁
  • 카카오코테
  • ARIMA모형
  • 삼성코테구현문제추천
  • 운영체제인터럽트
  • 데이터분석
  • 삼성코테준비
  • 삼성코테기출자바풀이
  • 삼성코테기출
  • 통계분석
  • 삼성코테자바풀이
  • 시계열분석
  • 삼성코테파이썬준비
  • AR모형

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

알고리즘/알고리즘문풀

BOJ - 택배 1719번 (JAVA)

2022. 7. 18. 23:52

❓ 문제 - 백준 택배 1719번 - JAVA 풀이법

 

출처 

(https://www.acmicpc.net/problem/1719)

 

1719번: 택배

명우기업은 2008년부터 택배 사업을 새로이 시작하기로 하였다. 우선 택배 화물을 모아서 처리하는 집하장을 몇 개 마련했지만, 택배 화물이 각 집하장들 사이를 오갈 때 어떤 경로를 거쳐야 하

www.acmicpc.net

 

 

📝 문제해결법

1. 문제 해석

  • 각 집하장 사이를 오갈 때 최단 거리로 오고 갈 수 있어야 한다.
  • 따라서 두 집하장 사이를 최단 거리를 오갈 수 있을 경우에 가장 먼저 거쳐야 하는 집하장을 구하여야 한다.

 

2. 변형된 플로이드 워셜을 활용하여 문제를 해결하였습니다.

  • 플로이드 워셜의 경우 시간 복잡도는 O(V^3)이기 때문에 문제에서 n이 200 이하이므로 500보다 작기 때문에 플로이드 워셜 알고리즘을 활용하여 구할 수 있습니다. -> 다익스트라도 가능..
  • 문제에서 주어진 것은 각 노드 간의 최단 거리가 아닌, 최단 거리르 이동할 때 가장 먼저 거쳐야 하는 집하장을 구해야하는 것이다.
    • 따라서 path 2차원 배열에 a->b로 노드를 이동할 때 가장 먼저 거쳐야 하는 집하장의 번호를 담아서 마지막에 이것을 출력한다.
    • 초반에 a->b 로 이동하면 첫 구간은 b가 되며, a -> k -> b로 이동할 때 첫 구간은 c가 된다.
    • 따라서 path[a][b]에 대해서 첫 구간은 도착지점인 b가 된다.
    • 플로이드 워셜을 구하는 부분에서 [i][j] = [i][k] + [k][j] 인 부분에서 첫 구간은 중간지점의 [i][k]가 된다.

 

3. 느낀점

  • 처음에 문제를 딱 보고 플로이드 워셜이나 다익스트라구나 하고 자세히 안보고 코드 작성하다가.. 실수 했다는 것을 깨달았다.
  • 다음부터는 풀이법이 바로 떠오른다고 해도 다시 한번 문제를 살피면서 내 문제해설에 오류가 없는지 검토 해야겠다.

 

 

💻 소스코드 

// BOJ - 택배(1724번)
// 플로이드 워셜
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main_1719 {
    public static int n, m;
    public static int[][] distance, path;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        distance = new int[n+1][n+1];
        path = new int[n+1][n+1];


        for(int i=1;i<=n;i++){
            Arrays.fill(distance[i], 10000*1000-1);
            distance[i][i] = 0;
        }

        for(int i=0;i<m;i++){
            st = new StringTokenizer(br.readLine(), " ");
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            int c = Integer.parseInt(st.nextToken());
            path[a][b] = b;
            path[b][a] = a;
            distance[a][b] = Math.min(distance[a][b], c);
            distance[b][a] = Math.min(distance[b][a], c);
        }

        for(int k=1;k<=n;k++){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(k == i) continue;
                    if(distance[i][j] > distance[i][k]+distance[k][j]){
                        distance[i][j] = distance[i][k]+distance[k][j];
                        path[i][j] = path[i][k];
                    }
                }
            }
        }

        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i == j) {
                    System.out.print("-" + " ");
                    continue;
                }
                System.out.print(path[i][j] + " ");
            }
            System.out.println();
        }

    }
}

'알고리즘 > 알고리즘문풀' 카테고리의 다른 글

BOJ - 로봇 청소기 4991번 (JAVA)  (0) 2022.07.21
BOJ - 싸지방에 간 준하 12764번 (JAVA)  (0) 2022.07.19
BOJ - 달빛 여우 16118번 (JAVA)  (1) 2022.07.17
BOJ - 후위 표기식 1918번 (JAVA)  (0) 2022.07.15
BOJ - 거울 설치 2151번 (JAVA)  (0) 2022.07.15
    '알고리즘/알고리즘문풀' 카테고리의 다른 글
    • BOJ - 로봇 청소기 4991번 (JAVA)
    • BOJ - 싸지방에 간 준하 12764번 (JAVA)
    • BOJ - 달빛 여우 16118번 (JAVA)
    • BOJ - 후위 표기식 1918번 (JAVA)
    developer-ellen
    developer-ellen

    티스토리툴바