https://school.programmers.co.kr/learn/courses/30/lessons/43164
본 문제를 풀면서 놓쳤던 부분들을 아래에 정리하였다.
💡 문제를 풀면서 놓쳤던 부분들
💡아이디어
문제 풀이
참고한 블로그
위 블로그를 참고하여 코드를 작성했다.
def solution(tickets):
answer = []
# 1. 그래프 생성
routes = dict()
for (start, end) in tickets:
routes[start] = routes.get(start, []) + [end]
# start를 키로 가지는 value(해당 출발지의 도착지)에 새로운 도착지점을 더해서 routes 딕셔너리의 start 키 값을 가지는 value에 저장 (=새로운 도착지점 찾을 시 value값 갱신)
# 여기서 (start, [])의 []는 만약 아직 start 값이 딕셔너리에 없는 경우 빈 리스트에 해당 도착지를 더해서 딕셔너리를 갱신하는 것이다.
# 2. {시작점: [끝점]} 딕셔너리 생성 및 끝점을 역순으로 정렬
for r in routes.keys():
routes[r].sort(reverse = True)
# 3. DFS 알고리즘으로 path를 만들어준다
stack = ["ICN"]
path = []
while stack:
top = stack[-1]
if top in routes and len(routes[top]) > 0:
stack.append(routes[top][-1])
routes[top] = routes[top][:-1] # stack에 넣어준 마지막 요소를 routes 딕셔너리에서 뺌
else:
path.append(stack.pop()) # 현재 출발지점의 도착지가 없으면 stack의 정보를 path에 저장함
# 4. 만든 path를 거꾸로 answer 배열에 저장
answer = path[::-1]
return answer
def solution(tickets):
# {"출발지: 도착지"} 딕셔너리 생성 => 딕셔너리 명: hash
hash = {}
for i in range(len(tickets)):
hash[tickets[i][0]] = 0
for key in hash.keys():
arr = []
for i in range(len(tickets)):
if key == tickets[i][0]:
arr.append(tickets[i][1])
arr.sort()
hash[key] = arr
# DFS
stack = ["ICN"] # 항상 "ICN" 공항에서 출발함
path = [] # 최종 여행 경로 저장
while stack:
now = stack[-1]
if now not in hash or len(hash[now]) == 0:
path.append(stack.pop()) # 더 이상 갈 경로가 존재하지 않으면 해당 위치를 path 배열에 추가함
else:
stack.append(hash[now][0]) # 이동할 도시를 stack에 추가
hash[now] = hash[now][1:] # 방문한 도시를 빼고 저장
answer = []
for i in range(len(path)): # path에는 여행지 이동 경로의 역순으로 저장되어 있으므로 path 배열의 역순을 answer 배열에 저장함
answer.append(path[len(path)-i-1])
# answer = path[::-1] # 위 for문에서 실행한 배열 역순으로 저장과 동일한 코드
return answer
실행 결과
- 참고한 블로그 의 코드는 전체 테스트 케이스를 0.02ms 안에 모두 실행 가능하다. 위 글을 참고하여 코드를 더욱 효율적으로 수정할 예정이다.
본 문제를 다시 풀어보면서 DFS 구현 시 while문 안의 조건문의 순서를 바꿔서 코드를 작성했다. 이 경우 다음과 같은 오류가 발생한다. 해당 원인을 파악하는 중이다.
def solution(tickets):
answer = []
# 출발지, 목적지 정보 딕셔너리 생성
route = {}
for i in range(len(tickets)):
route[tickets[i][0]] = 0
for key in route.keys():
arr = []
for i in range(len(tickets)):
if key == tickets[i][0]:
arr.append(tickets[i][1])
arr.sort()
route[key] = arr
# DFS
stack = []
stack.append("ICN")
path = []
while stack:
now = stack[-1]
# 오류 발생 부분
if len(route[now]) > 0 and now in route: # 이동할 도시가 있는 경우, 해당 도시를 stack에 추가하고 딕셔너리의 value 값에서 이동한 도시를 빼줌
stack.append(route[now][0])
route[now] = route[now][1:]
else: # 이동할 도시가 없는 경우
path.append(stack.pop()) # 최종 경로 저장 배열에 도시를 저장함
answer = path[::-1]
return answer
실행 결과