프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
나의 풀이
- 가능한 여러 경로를 얻고, 이 중에서 가장 앞서는 경로를 찾는 것이 핵심이다.
- 이중에서 가장 앞서는 경로를 처리하는데 어려움을 느껴 다른 사람의 풀이를 참고했다.
백트래킹 활용
- 현재 위치 정보를 전달해서 중복된 방문을 제한했다.
- [ic]path[/ic] 들을 저장해둔 [ic]answer[/ic]를 정렬하면서 가장 앞서는 경로를 얻을 수 있었다.
from collections import defaultdict
def solution(tickets):
# 방문 여부
visited = defaultdict(list)
# 그래프
graph = defaultdict(list)
start = "ICN"
goal = len(tickets) + 1
# 경로 정보
answer = []
# 그래프 정보 저장
for ticket in tickets:
a, b = ticket
graph[a].append(b)
visited[a].append(False)
def dfs(now, path):
nonlocal goal
if len(path) == goal:
answer.append(path)
return
# 순차적으로 탐색
for j in range(len(graph[now])):
if not visited[now][j]:
# 아직 방문하지 않은 경우
nxt = graph[now][j]
visited[now][j] = True
dfs(nxt, path + [nxt])
visited[now][j] = False
# 시작은 무조건 ICN
dfs("ICN", ["ICN"])
answer.sort()
return answer[0]
정렬 활용
- 가능한 모든 경로를 저장하는 대신, 미리 방문할 경로를 정렬해둬 한번에 정답 경로를 구할 수 있다.
- 알파벳이 앞서는 도시를 먼저 방문하고, 더이상 이동이 불가능하면 [ic]path[/ic]에 입력하는 방식이다.
- 따라서 [ic]path[/ic]를 역순으로 반환하면 정답 경로를 얻을 수 있다.
from collections import deque, defaultdict
def dfs(graph):
# 시작점 입력
stack = deque()
stack.append("ICN")
path = []
while stack:
# 출발 도시
start = stack.pop()
# 더이상 출발 - 도착 불가능할 경우 path에 저장
if start not in graph or not graph[start]:
path.append(start)
# 방문 가능할 경우
else:
stack.append(start)
stack.append(graph[start].pop())
return path[::-1]
def solution(tickets):
# 그래프 생성
graph = defaultdict(list)
for a, b in tickets:
graph[a].append(b)
# 도착 리스크 역순 정렬
# DFS에서 먼저 선택될 수 있도록
for k in graph.keys():
graph[k].sort(reverse = True)
answer = dfs(graph)
return answer
참고
[프로그래머스] 여행경로 Python 파이썬 DFS
[프로그래머스] lv 3. 여행경로 DFS 파이썬 풀이 - 주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "ICN" 공항에서 출발합니다.항공권 정보가 담긴 2차원 배열 titickets가 매개변수로
velog.io
여행 경로 - 파이썬(Python)
https://programmers.co.kr/learn/courses/30/lessons/43164 코딩테스트 연습 - 여행경로 [["ICN", "SFO"], ["ICN", "ATL"], ["SFO", "ATL"], ["ATL", "ICN"], ["ATL","SFO"]] ["ICN", "ATL", "ICN", "SFO", "ATL"..
lottegiantsv3.tistory.com