김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Remote저장소
  • GitHubDesktop
  • 원격저장소
  • ㄱ
  • KMU_WINK
  • 깃허브데스크탑
  • local저장소
  • 로컬저장소

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

•알고리즘(Algorithm )/문제풀이

[백준14938&파이썬] 플로이드와샬을 활용해 모든 정점에서 시작하여 모든정점까지 도착하는 경우를 구하자

2023. 5. 18. 21:53

# 문제

백준 14938 서강그라운드 파이썬 풀이

 

14938번: 서강그라운드

예은이는 요즘 가장 인기가 있는 게임 서강그라운드를 즐기고 있다. 서강그라운드는 여러 지역중 하나의 지역에 낙하산을 타고 낙하하여, 그 지역에 떨어져 있는 아이템들을 이용해 서바이벌을

www.acmicpc.net

# 코드

'''
  - 한 정점에서 모든정점까지의 최단거리를 구하자. ( X )
    - 다익스트라 알고리즘 ?? 
  - 아니다 문제를 잘못 봤다. 
    - 플로이드 와샬로 모든정점에서 모든정점까지의 최단거리를 구해야 한다.
'''
import sys

def print2D(arr) :
  for i in arr :
    print(*i)

# n : 지역의 개수
# m : 수색범위
# r : 길의 개수
n, m, r = map(int, sys.stdin.readline().split())
items = list(map(int, sys.stdin.readline().split()))
graph = [[float('inf')] * (n+1) for _ in range(n+1)]

for _ in range(r):
  a, b, c = map(int, sys.stdin.readline().split())
  graph[a][b] = min(graph[a][b], c)
  graph[b][a] = min(graph[b][a], c)

# 대각행렬(자기 자신)은 0으로 초기화 한다.
for i in range(n+1) :
  graph[i][i] = 0


# 플로이드 와샬
for pivot in range(1,n+1) :
  for start in range(1,n+1) :
    for end in range(1,n+1) :
      cost = graph[start][pivot] + graph[pivot][end] # 피벗을 거쳐가는 것과 비교하기 위해서
      if cost < graph[start][end] :
        graph[start][end] = cost

# print2D(graph)

result = 0
for start in range(1,n+1) :
  sum = 0
  for end in range(1,n+1) :
    if graph[start][end] <= m : # 수색범위 이내이면
     sum  += items[end-1] # 범위 맞춰줘야함
  result = max(result,sum)

print(result)

# 풀이

  • 문제를 해결하기 위해서는 모든정점에서 시작하여 모든정점까지 가는 거리의 최단경로를 구해야 한다.
  • 거리의 최단경로를 구했다면, 이동가능 거리(m)이내로 이동 가능한 정점들에 대하여, item의 합들을 구한다.
  • 플로이드 와샬은 n^3의 시간복잡도를 가진다. 그렇기 때문에 노드(정점)의 개수가 적을 경우 유용하다. 
  • 이 문제의 경우 제시된 정점(지역)의 개수가 (1 <= n <= 100) 이기 때문에 100*100*100 해봐야 1,000,000으로 백만밖에 되지 않는다.
  • 다익스트라, 크루스칼, 플로이드와샬 알고리즘을 오랜만에 접하니 다 까먹었다. 다시 한번 훓어 봐야 겠다.
저작자표시 (새창열림)

'•알고리즘(Algorithm ) > 문제풀이' 카테고리의 다른 글

[백준17144&파이썬] 시계 또는 반시계 방향으로 배열원소 회전하기 , 탐색 후 일괄업데이트  (0) 2023.05.20
[백준14502&파이썬] 조합과 BFS탐색을 적절히 활용하는 구현문제에서는 시작점에 대한 고민을 해보자  (1) 2023.05.20
[백준12851&파이썬] BFS를 이용해 최단시간 도착과 최단시간의 모든경우의 수를 구하자  (0) 2023.05.13
[백준13549&파이썬] BFS에서 큐에 넣을때 때때로 순서도 중요하다.  (1) 2023.05.11
[백준2638&파이썬] BFS에 구현과 시뮬레이션이 섞인 문제  (0) 2023.05.11
    '•알고리즘(Algorithm )/문제풀이' 카테고리의 다른 글
    • [백준17144&파이썬] 시계 또는 반시계 방향으로 배열원소 회전하기 , 탐색 후 일괄업데이트
    • [백준14502&파이썬] 조합과 BFS탐색을 적절히 활용하는 구현문제에서는 시작점에 대한 고민을 해보자
    • [백준12851&파이썬] BFS를 이용해 최단시간 도착과 최단시간의 모든경우의 수를 구하자
    • [백준13549&파이썬] BFS에서 큐에 넣을때 때때로 순서도 중요하다.
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바