본문 바로가기

알고리즘

프로그래머스, 여행경로

728x90

프로그래머스, 여행경로

 

❓문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

❓분류

accepted
개발자 친구의 도움을 받았다.
수많은 코드들을 봐도 이해가 안됐는데, 설명들으니 이해된다.
설명 들은 다음 날 스스로 풀어봤다! 시간이 지난 뒤 다시 풀어봐야 할 문제~
모든 티켓을 사용해야 한다는 점이 문제의 풀이법을 생각하는데 핵심!
 

❓ 접근 방법

티켓의 사용여부를 체크해가며 모든 항공권을 사용하는 경로를 저장한다.
만약 해당 항공권을 사용하지 못하는 경우, 이전 출발지로 돌아가 다른 티켓을 사용해 이동한다.(백트래킹)
모든 항공권을 사용하는 경로가 여러개 일 경우 알파벳 순서가 앞서는 경로를 답으로 출력한다.
 

📜 나의 풀이1

from collections import defaultdict

def dfs(city):
    global routes, used, path, N, result

    if len(path) == N + 1:
        # 모든 도시 방문 했다면 result에 해당 경로 저장
        result.append("".join(path))
        return

    if len(routes[city]) == 0:
        # 더 이상 갈 도시 없다면, 예전 위치로 돌아가 티켓 변경
        return

    for i in range(len(routes[city])):
        next_city = routes[city][i]
        if not used[city][i]:
            used[city][i] = True
            path.append(next_city)
            dfs(next_city)
            used[city][i] = False
            path.pop()

def solution(tickets):
    
    # 출발지에서 갈 수 있는 도착지 정보 담고 있는 딕셔너리
    # 각 티켓의 사용여부 표시하는 딕셔너리
    global routes, used, N, result, path
    
    N = len(tickets)
    
    routes = defaultdict(list)
    used = defaultdict(list)
    for start, end in tickets:
        routes[start].append(end)
        used[start].append(False)
    
    path = ['ICN']
    result = []
    
    dfs('ICN')
    # 만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return 합니다.
    result = sorted(result)[0]
    
    answer = []
    for i in range(0, len(result), 3):
        answer.append(result[i:i+3])
        
    return answer

 

 

📜 나의 풀이2

from collections import defaultdict

def tour(cur_air, n):
    global total_airport, trip_visit, trip_info, airports, all_routes
    
    if n == total_airport:
        all_routes.append("".join(airports))
        return
    for next_idx in range(len(trip_info[cur_air])):
        next_air = trip_info[cur_air][next_idx]
        if not trip_visit[cur_air][next_idx]:
            trip_visit[cur_air][next_idx] = True
            airports.append(next_air)
            tour(next_air, n+1)
            trip_visit[cur_air][next_idx] = False
            airports.pop()
    
def solution(tickets):
    START_IDX = 0
    SEPARATE_NUM = 3
    
    global total_airport, trip_visit, trip_info, airports, all_routes
    
    trip_info = defaultdict(list)
    trip_visit = defaultdict(list)
    for start, end in tickets:
        trip_info[start].append(end)
        trip_visit[start].append(False)
    
    total_airport = len(tickets)
    airports = ['ICN']
    all_routes = []
    tour('ICN', 0)
    
    all_routes = sorted(all_routes)
    sort_route = all_routes[START_IDX]
    
    answer = []
    for i in range(START_IDX, len(sort_route), SEPARATE_NUM):
        answer.append(sort_route[i:i+SEPARATE_NUM])
    
    return answer

'알고리즘' 카테고리의 다른 글

백준, 사다리 조작(combinations 활용)  (0) 2023.10.13
백준, 사다리 조작  (1) 2023.10.13
백준, 뱀  (0) 2023.10.11
프로그래머스, 게임 맵 최단거리  (0) 2023.09.25
프로그래머스, 광물캐기  (0) 2023.09.10