728x90
14938번: 서강그라운드
예은이는 요즘 가장 인기가 있는 게임 서강그라운드를 즐기고 있다. 서강그라운드는 여러 지역중 하나의 지역에 낙하산을 타고 낙하하여, 그 지역에 떨어져 있는 아이템들을 이용해 서바이벌을
www.acmicpc.net
🤔 문제분석
플로이드 워셜, 데이크스트라를 떠올리면 된다.
플로이드워셜
플로이드 워셜로 모든 노드까지의 모든 최단경로를 구한뒤, i번노드에서 다른노드까지 거리가 m이하인 경우만 아이템을 획득하게 만들면 된다.
데이크스트라
i번 노드에서 다른노드까지의 최단 거리를 구한뒤 ( 데이크스트라 ) 모든 거리가 m 이하인 경우만 아이템을 획득 할 수 있으므로 m이하인 거리만 item을 획득하게 하면된다.
💻 코드
플로이드워셜
import sys
input = sys.stdin.readline
n, m, r = map(int, input().split())
items = list(map(int, input().split()))
INF = sys.maxsize
distance = [[INF for _ in range(n+1)] for _ in range(n+1)]
for i in range(1, n+1):
distance[i][i] = 0
for _ in range(r):
a, b, l = map(int, input().split())
distance[a][b] = l
distance[b][a] = l
for k in range(1, n+1):
for i in range(1, n+1):
for j in range(1, n+1):
if i != j:
distance[i][j] = min(distance[i][k] + distance[k][j], distance[i][j])
ans = 0
for i in range(1, n+1):
count = items[i-1]
for j in range(1, n+1):
if i != j:
if m >= distance[i][j]:
count += items[j-1]
ans = max(count, ans)
print(ans)
데이크스트라
import sys
import heapq
input = sys.stdin.readline
n, m, r = map(int, input().split())
items = list(map(int, input().split()))
edge = [[] for _ in range(n+1)]
for _ in range(r):
a, b, l = map(int, input().split())
edge[a].append((b, l))
edge[b].append((a, l))
def dijikstra(start):
queue = []
INF = sys.maxsize
distance = [INF for _ in range(n+1)]
heapq.heappush(queue, (0, start))
distance[start] = 0
score = items[start-1]
while queue:
cost, node = heapq.heappop(queue)
if cost > distance[node]:
continue
if m >= cost and distance[node] > cost:
score += items[node-1]
distance[node] = cost
for child, c in edge[node]:
newcost = cost + c
if distance[child] > newcost:
heapq.heappush(queue, (newcost, child))
return score
ans = 0
for i in range(1, n+1):
ans = max(ans, dijikstra(i))
print(ans)
🎯 피드백 및 개선사항
이번문제는 비교적 쉽게 풀었습니다. 플로이드 워셜 알고리즘과 데이크스트라 알고리즘을 알고 있다면 문제를 딱 읽자마자 해당 풀이법이 생각 날 것 입니다.
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 9370번 : 미확인 도착지 (0) | 2024.03.24 |
---|---|
[백준] 14442번 : 벽 부수고 이동하기 2 (0) | 2024.03.24 |
[백준] 2668번 : 숫자고르기 (0) | 2024.03.21 |
[백준] 5427번 : 불 (0) | 2024.03.21 |
[백준] 1774번 : 우주신과의 교감 (0) | 2024.03.19 |