코딩 테스트/Level 3

여행경로 *

컴닥 2020. 9. 12. 22:39
반응형

여행경로
깊이/너비 우선 탐색(DFS/BFS)
2586명 완료

https://programmers.co.kr/learn/courses/30/lessons/43164

 

코딩테스트 연습 - 여행경로

[[ICN, SFO], [ICN, ATL], [SFO, ATL], [ATL, ICN], [ATL,SFO]] [ICN, ATL, ICN, SFO, ATL, SFO]

programmers.co.kr

시간을 고려하지 않고 문제를 풀겠습니다. 

def solution(tickets):
    from itertools import permutations
    answer = []
    for path in permutations(tickets):
        temp = ['ICN']
        for ticket in path:
            if ticket[0] == temp[-1]:
                temp.append(ticket[1])
            else:
                break
        else:
            answer.append(temp)
    return sorted(answer)[0]

당연히 시간제한이 걸리겠죠.. ^^;;

테스트 1 〉	실패 (시간 초과)
테스트 2 〉	통과 (0.04ms, 10.7MB)
테스트 3 〉	통과 (0.05ms, 10.7MB)
테스트 4 〉	통과 (0.04ms, 10.6MB)

직접 순열 알고리듬을 만들고
중간에 조건을 걸어 필터링 해주면 시간이 많이 절약될 것 같습니다. 

예전에 순열 만든 걸 재탕하겠습니다.
https://comdoc.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%88%9C%EC%97%B4%EA%B3%BC-%EC%A1%B0%ED%95%A9

def perm(arr, depth, n, k, answer):
    if depth == 1 and arr[0][0] != 'ICN':
        return
    if depth > 1 and arr[depth - 2][1] != arr[depth - 1][0]:
        return
    if depth == k:
        temp = [arr[i][0] for i in range(n)]
        temp.append(arr[n - 1][1])
        answer.append(temp[:])
        return
    for i in range(depth, n):
        arr[i], arr[depth] = arr[depth], arr[i]
        perm(arr, depth + 1, n, k, answer)
        arr[i], arr[depth] = arr[depth], arr[i]


def solution(tickets):
    answer = []
    perm(tickets, 0, len(tickets), len(tickets), answer)
    return sorted(answer)[0]
테스트 1 〉	통과 (476.86ms, 13.8MB)
테스트 2 〉	통과 (0.02ms, 9.46MB)
테스트 3 〉	통과 (0.02ms, 9.46MB)
테스트 4 〉	통과 (0.04ms, 9.62MB)

다행히 통과.. 레벨3부터는 잘 풀자보다 통과라도... 라는 생각이..

 

제가 소개한 순열도 깊이 우선 검색을 바탕에 깔고 있지만...
마지막에 모아서 정렬하지 말고, 중간 중간 미리 정렬하면 더 빨리 답을 찾을 수 있겠죠?

def solution(tickets, arrived=['ICN']):
    if not tickets:
        return arrived
    next_airports = [index for index, (ap, _) in enumerate(tickets) if ap == arrived[-1]]
    if not next_airports:
        return None
    next_airports.sort(key=lambda x: tickets[x][1])
    for next_airport in next_airports:
        checker = solution(tickets[:next_airport] + tickets[next_airport + 1:], arrived + [tickets[next_airport][1]])
        if checker is not None:
            return checker
테스트 1 〉	통과 (0.10ms, 10.1MB)
테스트 2 〉	통과 (0.02ms, 10.2MB)
테스트 3 〉	통과 (0.01ms, 10.2MB)
테스트 4 〉	통과 (0.01ms, 10.2MB)
반응형