카테고리 없음

[프로그래머스] 여행경로

hazel_ 2021. 5. 1. 16:23

 

 

내가 풀었던 방식으로 했을때는 테스트 케이스 1번과 2번에서 문제가 발생했다.

ex) 

tickets=[['ICN' ,'AAA'], ['ICN', 'BBB'] ,['BBB','ICN']]

답 : ['ICN', 'BBB', 'ICN', 'AAA']

이렇게 나와야하는데, 나의 방식은 ['ICN', 'AAA', 'ICN', 'BBB']로 나온다.

이 방법의 문제점은 AAA에서 출발하는 노선이 없다는 것. 따라서 저 방법은 성립하지 못한다.

 

 

나의 풀이

def solution(tickets):
    answer=[]
    tickets.sort(key=lambda x:(-(x[0]=='ICN'),x[1]))

    index=0
    answer.append(tickets[0][0])

    while True:
        if len(tickets)==0:
            break
        de, en = tickets[index]
        answer.append(en)
        tickets.__delitem__(index)
        for i in range(len(tickets)):
            if tickets[i][0]==en:
                index=i
                break

    return answer

 

고친 풀이 1 (스택사용)

def solution(tickets):
    answer=[]
    tickets.sort(reverse=True)
    routes=dict()

    for t1, t2 in tickets:
        if t1 in routes:
            routes[t1].append(t2)
        else:
            routes[t1]=[t2]

    st=['ICN']
    print(routes)

    while st:
        print(st)
        top=st[-1]
        if top not in routes or len(routes[top])==0:
            answer.append(st.pop())
        else:
            st.append(routes[top].pop())

    answer.reverse()

    return answer

 

고친 풀이 2 (DFS 사용)

def dfs(graph, N, path, here):
    path.append(here)

    if len(path)==N+1:
        return True

    if here not in graph:
        path.pop()
        return False

    for i in range(len(graph[here])):
        there=graph[here][-1]
        graph[here].pop()

        if dfs(graph,N,path,there):
            return True

        graph[here].insert(0,there)

    path.pop()
    return False

def solution(tickets):
    answer=[]

    routes=dict()

    for (start, end) in tickets:
        routes[start]=routes.get(start,[])+[end]

    for r in routes.keys():
        routes[r].sort(reverse=True)

    N=len(tickets)
    path=[]

    if dfs(routes, N, path, 'ICN'):
        answer=path

    return answer