[programmers/CodingTest/Python]旅行経路
6370 ワード
問題の説明
与えられたすべての航空券を利用して旅行ルートを作りたいです.いつも「ICN」空港から
航空券情報を含む2次元配列航空券をパラメータとして指定する場合は、アクセスした空港経路をレイアウトに入れて返します.
せいげんじょうけん
I/O例
tickets return
[["ICN", "JFK"], ["HND", "IAD"], ["JFK", "HND"]] ["ICN", "JFK", "HND", "IAD"]
[["ICN", "SFO"], ["ICN", "ATL"], ["SFO", "ATL"],
["ATL", "ICN"], ["ATL","SFO"]] ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"]
I/O例説明例1
["ICN", "JFK", "HND", "IAD"]
の順序でアクセスできます.例2
["ICN", "SFO", "ATL", "ICN", "ATL", "SFO"]
の順でアクセスすることもできますが、["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"]
はアルファベット順でリードしています.方法
この問題は深い探索を経て解決された.まずramdaを使用してticketを到着地のアルファベット順に並べ替え、次の目的地を格納するためにディックシーケンス図を生成します.これで目的地をアルファベット順に選択できます.そして、この問題では、すべてのチケットを使うことが重要なポイントなので、その目的地に行ったら、すべてのチケットが使えないので、再び戻らなければなりません.したがって、深度優先探索では、現在のパスリストの長さとチケットの長さ+1が等しい場合にのみ、戻りパスリストが記述される.
lambdaを用いて
x[1]
を基準に昇順ソートした.->
graph[frm]
にtoを加えます.->結果の長さがチケットの長さ+1に等しい場合、
-->結果を返します.
->
enumerate(graph[cur])
巡回のi,nxtのfor文.-->
graph[cur]
でiの最初の要素を削除します.-->n resultsは
result[:]
として格納されます.([:]を貼り付けてコピー)-->n resultsにnxtを加えます.
-->ansは
dfs(nxt, n_results)
として保存されます.-->ansがtrueの場合はansを返します.
-->
graph[cur]
のiインデックスにnxtを追加します.dfs('ICN', ['ICN'])
に保存します.solution.py import collections
def solution(tickets):
tickets.sort(key=lambda x: x[1])
graph=collections.defaultdict(list)
for frm, to in tickets:
graph[frm].append(to)
def dfs(cur, results):
if len(results)==len(tickets)+1:
return results
for i, nxt in enumerate(graph[cur]):
graph[cur].pop(i)
n_results=results[:]
n_results.append(nxt)
ans=dfs(nxt, n_results)
if ans:
return ans
graph[cur].insert(i, nxt)
answer=dfs('ICN', ['ICN'])
return answer
Reference
この問題について([programmers/CodingTest/Python]旅行経路), 我々は、より多くの情報をここで見つけました
https://velog.io/@xx0hn/Programmers-CodingTest-Python-여행경로
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
import collections
def solution(tickets):
tickets.sort(key=lambda x: x[1])
graph=collections.defaultdict(list)
for frm, to in tickets:
graph[frm].append(to)
def dfs(cur, results):
if len(results)==len(tickets)+1:
return results
for i, nxt in enumerate(graph[cur]):
graph[cur].pop(i)
n_results=results[:]
n_results.append(nxt)
ans=dfs(nxt, n_results)
if ans:
return ans
graph[cur].insert(i, nxt)
answer=dfs('ICN', ['ICN'])
return answer
Reference
この問題について([programmers/CodingTest/Python]旅行経路), 我々は、より多くの情報をここで見つけました https://velog.io/@xx0hn/Programmers-CodingTest-Python-여행경로テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol