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
실행 결과