[백준] 1956번: 운동 Python (플로이드-워셜)

2023. 3. 4. 12:20·Algorithm (PS)
목차
  1.  
  2. 전체 코드 
728x90

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

pypy 로 제출해서 맞은 코드 

플로이드워셜이라는 힌트를 가지고 풀었다. 
처음에는 Union-find 로 사이클을 찾아야 하는가? 라고 생각했으나, 결국 문제에서는 최소 경로 비용을 구하는 것이 핵심이므로 플로이드 워셜로 푸는것이 더 적절하다고 판단했다. 

우선,graph 구성했다.  예제를 기준으로 아래의 graph를 만들어 보았다.
graph 에는 a-> b 가는 경로의 비용을 저장한다. 자기자신 노드에서 자기자신노드로 가는 경우 0 으로 초기화한다. 갈 수 없는 경로의경우 INF 값을 저장해서 경로가 없음을 표시했다. 

우선 플로이드 워셜 알고리즘으로 i -> j 지점까지의 최소 경로를 구해서 graph 에 저장했다. 

for k in range(1, v+1):
    for i in range(1, v+1):
        for j in range(1, v+1):
            if graph[i][k] + graph[k][j] < graph[i][j]:
                graph[i][j] = min(graph[i][k] + graph[k][j], graph[i][j])

graph 테이블에 저장한 최소경로를 이용해서 cycle이 생성되는 경우를 찾아주었다.

단, i == j == k 의 경우 자기자신 노드 to 자기자신 노드 가 되어버리므로 이 경우를 제외시켰다.
그리고 i to k 또는 k to j, j  to k 또는 k to i 경로 비용이 INF라는 것은 갈 수 없다는 것을 의미하므로 이 경우도걸러주었다. 

for k in range(1, v+1):
    for i in range(1, v+1):
        for j in range(1, v+1):
            if not (i == j == k):
                if graph[i][k] != INF and graph[k][j] != INF and graph[j][k] != INF and graph[k][i] != INF:
                    temp = graph[i][k] + graph[k][j] + graph[j][k] + graph[k][i]
                    answer = min(temp, answer)

 

전체 코드 

import sys

input = sys.stdin.readline

INF = int(1e9)
v, e = map(int, input().split())
answer = INF

graph = [[INF] * (v+1) for _ in range(v+1)]

for i in range(1, v+1):
    for j in range(1, v+1):
        if i == j:
            graph[i][j] = 0 # 자기 자신 to 자기 자신

for i in range(e):
    a, b, cost = map(int, input().split())
    graph[a][b] = cost

for k in range(1, v+1):
    for i in range(1, v+1):
        for j in range(1, v+1):
            if graph[i][k] + graph[k][j] < graph[i][j]:
                graph[i][j] = min(graph[i][k] + graph[k][j], graph[i][j])

for k in range(1, v+1):
    for i in range(1, v+1):
        for j in range(1, v+1):
            if not (i == j == k):
                if graph[i][k] != INF and graph[k][j] != INF and graph[j][k] != INF and graph[k][i] != INF:
                    temp = graph[i][k] + graph[k][j] + graph[j][k] + graph[k][i]
                    answer = min(temp, answer)
                    
if answer == INF:
    print(-1)
else:
    print(answer)
728x90

'Algorithm (PS)' 카테고리의 다른 글

[프로그래머스] 행렬 테두리 회전하기 Python/파이썬  (0) 2023.03.05
[백준] 18428번: 감시 피하기  (0) 2023.03.05
[프로그래머스] 경주로 건설 (DFS+DP) Python + 히든케이스 정리  (1) 2023.03.04
[프로그래머스] 표 편집 (Python) - Linked List  (0) 2023.03.02
[백준] 1987번: 알파벳 Python - DFS/Backtracking  (0) 2023.02.28
  1.  
  2. 전체 코드 
'Algorithm (PS)' 카테고리의 다른 글
  • [프로그래머스] 행렬 테두리 회전하기 Python/파이썬
  • [백준] 18428번: 감시 피하기
  • [프로그래머스] 경주로 건설 (DFS+DP) Python + 히든케이스 정리
  • [프로그래머스] 표 편집 (Python) - Linked List
minjiwoo
minjiwoo
Data Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minjiwoo
minji's engineering note
minjiwoo
전체
오늘
어제
  • 분류 전체보기 (613)
    • Data Engineering (42)
      • Apache Spark (11)
      • Databricks & Delta Lake (9)
      • Airflow (3)
      • SQL (6)
      • Trouble Shooting (2)
      • Hadoop (2)
      • MLOps (1)
    • Cloud Engineering (104)
      • AWS (23)
      • Linux 🐧 (29)
      • Docker 🐳 (21)
      • Kubernetes ⚙️ (20)
      • Ansible (10)
    • Computer Science (87)
      • 네트워크 (9)
      • 운영체제 (25)
      • 정보처리기사 (48)
      • CS 기술 면접 스터디 (3)
    • Programming Languages (27)
      • Python (17)
      • C와 C++ (10)
    • Backend (5)
      • Django (2)
    • 프로젝트 (2)
      • 테크포임팩트 (2)
    • iOS (11)
      • 레이블러리 (2)
    • Algorithm (PS) (275)
      • LeetCode (6)
    • 개발일기 (30)
      • 내돈내산 후기🎮 (3)
      • 개발자 취준생 (5)
      • Today I Learned (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Hi there

인기 글

태그

  • Databricks
  • 스파크
  • 데이터엔지니어링
  • Leetcode
  • 백준
  • EC2
  • 빅데이터
  • docker
  • python
  • 쿠버네티스
  • 알고리즘
  • 데이터브릭스
  • BFS
  • SPARK
  • AWS
  • 파이썬
  • 데이터엔지니어
  • 클라우드
  • 리눅스
  • 운영체제
  • 카카오코딩테스트
  • ansible
  • 백트래킹
  • 프로그래머스
  • linux
  • dp
  • Kubernetes
  • 코딩테스트
  • dfs
  • Swift

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
minjiwoo
[백준] 1956번: 운동 Python (플로이드-워셜)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.