[프로그래머스/Python] 코딩테스트연습 - DFS/BFS - 여행경로

2024. 10. 8. 12:38·코딩테스트/프로그래머스
728x90
반응형

문제 설명

주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "ICN" 공항에서 출발합니다.

항공권 정보가 담긴 2차원 배열 tickets가 매개변수로 주어질 때, 방문하는 공항 경로를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

#제한사항

  • 모든 공항은 알파벳 대문자 3글자로 이루어집니다. 
  • 주어진 공항 수는 3개 이상 10,000개 이하입니다. 
  • ticktets의 각 행 [a,b]는 a공항에서 b공항으로 가는 항공권이 있다는 의미입니다. 
  • 주어진 항공권은 모두 사용해야 합나다. 
  • 만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return합니다. 
  • 모든 도시를 방문할 수 없는 경우는 주어지지 않습니다. 

#입출력 예 

- 3번째 테스트 케이스는 반례를 위해 따로 추가했다. 이게 포인트라고 생각함.

tickets return 
[["ICN", "JFK"], ["HND", "IAD"], ["JFK", "HND"]] ["ICN", "JFK", "HND", "IAD"]
[["ICN", "SFO"], ["ICN", "ATL"], ["SFO", "ATL"], ["ATL", "ICN"], ["ATL","SFO"]] ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"]
[["ICN", "D"], ["D", "ICN"], ["ICN", "B"]]
["ICN", "D", "ICN", "B"]

 

#입출력 예 설명

- 예제 #1

["ICN", "JFK", "HND", "IAD"] 순으로 방문할 수 있습니다.

- 예제 #2

["ICN", "SFO", "ATL", "ICN", "ATL", "SFO"] 순으로 방문할 수도 있지만 ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"] 가 알파벳 순으로 앞섭니다.

풀이 코드 

모든 경로를 탐색해야 하는 경우니까 DFS 선택

## 1. solution 함수 

  • 각 티켓의 도착지를 알파벳으로 오름차순으로 정렬함 => sort(key=lambda x:x[1]) 
  • 출발지를 "ICN"으로 두고 dfs 돌리기 
from collections import deque

routes = []
def solution(tickets):
    answer = []
    tickets.sort(key=lambda x:x[1]) # 티켓의 도착지 기준 알파벳 정렬 
    visited = [False] * len(tickets)
    #routes.append("ICN")
    dfs(visited, "ICN", "ICN", tickets)
    answer = list(map(str,routes[0].split()))
    return answer

## 2. dfs 함수 

  • dfs 종료 조건: 모든 티켓을 사용했을 때 
  • for문 
    • 각 티켓 아직 사용 안했고, 티켓의 출발지가 start와 일치하면 
      • => 그 티켓의 도착지를 출발지로 설정해 dfs 다시 돌린다. 
    • visited[i] = False => 테스트케이스#3을 위한 것 
      • tickets = [["ICN", "D"], ["D", "ICN"], ["ICN", "B"]] 
      • return = ["ICN", "D", "ICN", "B"] 이어야 할 때 
      • 알파벳 순으로 정렬하면 [ICN, B] 먼저 사용하게 되지만, B가 출발지인 티켓이 없다. 이 때 dfs는 더 깊이 탐색하지 못하고 돌아오게 된다. 즉, 해당 티켓을 다시 내려놓는 경우가 생김. 이 경우를 대비해서 dfs() 재귀호출 밑에 추가해두는 것 !!!
def dfs(visited, start, route, tickets):
    #print(f"start {start}")
    if False not in visited:
        routes.append(route)
        return 
    for i in range(len(tickets)):
        #print(f"about {tickets[i]}")
        if visited[i] == False and tickets[i][0] == start:
            visited[i] = True 
            #route.append(tickets[i][1])
            #print(route+" "+tickets[i][1])
            dfs(visited, tickets[i][1], route+" "+tickets[i][1], tickets)
            visited[i] = False #POINT

 

전체 코드 

from collections import deque
## DFS ##
def solution(tickets):
    answer = []
    tickets.sort(key=lambda x:x[1]) # 티켓의 도착지 기준 알파벳 정렬 
    visited = [False] * len(tickets)
    #routes.append("ICN")
    dfs(visited, "ICN", "ICN", tickets)
    answer = list(map(str,routes[0].split()))
    return answer 

routes = []

def dfs(visited, start, route, tickets):
    #print(f"start {start}")
    if False not in visited:
        routes.append(route)
        return 
    for i in range(len(tickets)):
        #print(f"about {tickets[i]}")
        if visited[i] == False and tickets[i][0] == start:
            visited[i] = True 
            #route.append(tickets[i][1])
            #print(route+" "+tickets[i][1])
            dfs(visited, tickets[i][1], route+" "+tickets[i][1], tickets)
            visited[i] = False #POINT
728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[프로그래머스/Python] 알고리즘고득점Kit-정렬-가장 큰 수  (0) 2024.10.12
[프로그래머스/Python] 알고리즘고득점Kit-스택/큐-같은숫자는 싫어  (1) 2024.10.12
[프로그래머스]위클리챌린지1주차-부족한 금액 계산하기  (2) 2021.08.03
[프로그래머스]숫자문자열과영단어-Python3  (6) 2021.07.30
[프로그래머스]정수내림차순구하기-Python3  (2) 2021.07.29
'코딩테스트/프로그래머스' 카테고리의 다른 글
  • [프로그래머스/Python] 알고리즘고득점Kit-정렬-가장 큰 수
  • [프로그래머스/Python] 알고리즘고득점Kit-스택/큐-같은숫자는 싫어
  • [프로그래머스]위클리챌린지1주차-부족한 금액 계산하기
  • [프로그래머스]숫자문자열과영단어-Python3
heeya16
heeya16
개발 공부 냠냠
  • heeya16
    개발자 희야
    heeya16
  • 전체
    오늘
    어제
    • 분류 전체보기 (106)
      • 코딩테스트 (66)
        • 프로그래머스 (38)
        • SWEA (2)
        • BAEKJOON (26)
      • 알고리즘 (7)
      • 자료구조 (19)
      • 프로젝트 (5)
      • 취업 주르륵 (3)
      • 데이터베이스 (0)
      • IT지식 (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    1003
    10448
    10773
    10월
    10진수
    11047
    11399
    11403
    11866
    1449
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
heeya16
[프로그래머스/Python] 코딩테스트연습 - DFS/BFS - 여행경로
상단으로

티스토리툴바