[プログラマー/python]レベル2配信
6693 ワード
https://programmers.co.kr/learn/courses/30/lessons/12978#
アルゴリズム分類
問題を解く
最初は,アクセスノードを保存するアクセスリストを用いてアクセスの有無を確認し,探索を行った.しかし、もしそうなら、後で回って訪問するほうが早いかもしれません.
방문한 노드를 저장하는 변수(visit)을 사용하셨을 겁니다.
이미 방문한 노드를 다시 방문하지 않기 위해 사용하는 것인데,
중요한 것은 특정 노드를 방문했느냐 안했느냐(0 or 1)가 아닙니다.
특정 노드를 방문하는데 걸린 시간 중 최소의 값을 visit에 저장하고
특정 노드를 방문하는데 그 값보다 큰 시간이 걸리는 경우에는 탐색하지 않는 식으로 구현해보세요.
基本フレームワークは次のとおりです.ディック・シャナリーでレストランと村を結んで時間を貯めます.
ノードごとに最小限の時間を保存し、アクセスしたディックバッテリをKの最大値500001に初期化します.
例)
{1: 500001, 2: 8, 3: 500001, 4: 500001, 5: 500001}
{1: 500001, 2: 8, 3: 500001, 4: 2, 5: 500001}
{1: 16, 2: 8, 3: 500001, 4: 2, 5: 500001}
{1: 16, 2: 8, 3: 11, 4: 2, 5: 500001}
{1: 16, 2: 8, 3: 11, 4: 2, 5: 10}
{1: 4, 2: 8, 3: 11, 4: 2, 5: 10}
{1: 4, 2: 8, 3: 11, 4: 2, 5: 4}
{1: 4, 2: 8, 3: 11, 4: 2, 5: 4}
{1: 4, 2: 6, 3: 11, 4: 2, 5: 4}
{1: 4, 2: 6, 3: 5, 4: 2, 5: 4}
その後,1を除いて2番ノードからK以下の時間であるかを確認し,結果を加えると正解となる.
ソースコード
from collections import deque
def solution(N, road, K):
dic={i:[] for i in range(1,N+1)}
for r in road:
a,b,w=r
dic[a].append((b,w))
dic[b].append((a,w))
queue=deque()
queue.append((1,0))
visited={i:500001 for i in range(1,N+1)}
while queue:
t,w=queue.popleft()
for i in dic[t]:
target,weight=i
tmp=w+weight
if visited[target]>=tmp:
visited[target]=tmp
queue.append((target,visited[target]))
result=1
for i in range(2,N+1):
if visited[i]<=K:
result+=1
return result
Reference
この問題について([プログラマー/python]レベル2配信), 我々は、より多くの情報をここで見つけました https://velog.io/@bye9/프로그래머스파이썬-Level-2-배달テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol