🔑 오늘의 학습 키워드 dfs, 백트래킹
🔗 문제링크 https://school.programmers.co.kr/learn/courses/30/lessons/43164
def solution(tickets):
n = len(tickets)
answer = []
def dfs():
if len(stack) == n+1 :
a = [stack[i] for i in range(n+1)]
answer.append(a)
for i in range(n):
if not visited[i] and stack[-1] == tickets[i][0] :
visited[i] = 1
stack.append(tickets[i][1])
dfs()
visited[i] = 0
stack.pop()
for i in range(n):
visited = [0] * n
stack = []
if tickets[i][0] == "ICN":
visited[i] = 1
stack.append(tickets[i][0])
stack.append(tickets[i][1])
dfs()
return min(answer)
🗒️ 공부한 내용 본인의 언어로 정리하기
🤔 문제를 보고 든 생각
단순히 bfs로 생각해서 인천에서 시작하는 경우로 탐색하면 된다고 생각했다.
하지만 방문하는 경우가 같을때 순서가 알파벳순으로 해야해서 그렇게 하면 안된다.
dfs로 풀면서 가지치기 해나가는 방식으로 해야겠다고 생각했다.
⏰ 예상 시간 복잡도 O( N * N! )
제한 사항
모든 공항은 알파벳 대문자 3글자로 이루어집니다.
주어진 공항 수는 3개 이상 10,000개 이하입니다.
tickets의 각 행 [a, b]는 a 공항에서 b 공항으로 가는 항공권이 있다는 의미입니다.
주어진 항공권은 모두 사용해야 합니다.
만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return 합니다.
모든 도시를 방문할 수 없는 경우는 주어지지 않습니다.
😎 알고리즘 개요
1. 입력 및 초기화
• tickets: 항공권 정보가 담긴 리스트, 각 항공권은 [“출발지”, “도착지”]의 형태입니다.
• n: 주어진 항공권의 개수.
• answer: 가능한 모든 경로를 담을 리스트.
2. DFS 탐색 함수 정의
• dfs() 함수는 현재 경로를 따라 깊이 우선 탐색을 수행합니다.
• 모든 항공권을 사용한 경우, 즉 len(stack) == n + 1이 되면 현재까지의 경로를 answer 리스트에 추가합니다.
• 반복문을 통해 현재 스택의 마지막 도시와 일치하는 출발지를 가진 항공권을 찾고, 그 항공권을 사용하면서 재귀적으로 dfs()를 호출하여 탐색을 이어갑니다.
3. 탐색 시작
• 처음에는 “ICN”에서 시작하는 항공권을 찾아 그 항공권으로부터 탐색을 시작합니다. 이때, 각 항공권의 사용 여부를 체크하기 위해 visited 리스트와 stack을 초기화합니다.
• 모든 탐색이 끝난 후, answer 리스트에 담긴 모든 경로 중 사전순으로 가장 빠른 경로를 반환합니다.
✅ 오늘의 회고
- 이것도 예전에 푼 문제이다.
- 옛날 내 코드는 별로다
#99클럽 #코딩테스트준비 #개발자취업 #항해99 #TIL
'Coding test' 카테고리의 다른 글
99클럽 코테 스터디 36일차 TIL, 백준 / 도미노 / 1552 (0) | 2024.08.26 |
---|---|
99클럽 코테 스터디 35일차 TIL, 프로그래머스 / 퍼즐 조각 채우기 (0) | 2024.08.25 |
99클럽 코테 스터디 33일차 TIL, 프로그래머스 / 단어 변환 (0) | 2024.08.23 |
99클럽 코테 스터디 32일차 TIL, 프로그래머스 / 아이템 줍기 (0) | 2024.08.22 |
99클럽 코테 스터디 31일차 TIL, 프로그래머스 / 네트워크 (0) | 2024.08.21 |