본문 바로가기
Algorithm/Baekjoon

14938. 서강그라운드 (Python)

by 원만사 2022. 5. 30.
반응형
 

14938번: 서강그라운드

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

www.acmicpc.net

 

풀이

 최단거리를 활용하는 문제인데 시작점이 주어지지 않는다. 그렇기 때문에 모든 지점에서 다른 지점까지의 최단 거리를 구하는 플로이드 워셜 알고리즘을 사용하자. 플로이드 워셜 알고리즘은 링크를 참고하자.

 

 플로이드 워셜을 사용하여 모든 지점에서 다른 지점까지의 최단 거리를 구한 후  for문을 통해서 1번부터 N번까지를 시작지점으로하여 수색범위내에 도착 가능한 지점의 아이템 개수를 카운트한다. 이중 가장 큰 값을 찾으면 된다.

 

코드

import sys
input = sys.stdin.readline
INF = float('inf')

if __name__ == '__main__':
    N, M, R = map(int, input().split())  # 지역 개수, 수색범위, 길의 개수
    items = [0] + list(map(int, input().split()))  # 각 구역 아이템 개수
    roads = [[INF for _ in range(N+1)] for _ in range(N+1)]  # 길 정보

    for i in range(1, N+1):  # 자기 자신으로 가는 길은 0으로 초기화한다.
        roads[i][i] = 0

    for _ in range(R):
        a, b, l = map(int, input().split())
        roads[a][b] = l
        roads[b][a] = l

    # 플로이드 워셜 알고리즘 수행
    for k in range(N):
        for i in range(1, N+1):
            for j in range(1, N+1):
                roads[i][j] = min(roads[i][j], roads[i][k] + roads[k][j])

    res = 0
    for i in range(1, N+1):
        count = 0  # i번을 시작점으로 했을 때 수색할 수 있는 지점의 아이템 개수의 합

        for j in range(1, N+1):
            if roads[i][j] <= M:
                count += items[j]

        res = max(res, count)

    print(res)
반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

1082. 방 번호 (Python)  (0) 2022.06.02
11779. 최소비용 구하기 2 (Python)  (0) 2022.05.30
12851. 숨바꼭질 2 (Python)  (0) 2022.05.29
2263. 트리의 순회 (Python)  (0) 2022.05.27
5639. 이진 검색 트리 (Python)  (0) 2022.05.26

댓글