문제 출처 : 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
#1. 설계 및 풀이
- 처음에는 BFS로 풀다가 안된다는 걸 깨닫고 DFS로 돌렸다.
- DFS로 푸는데 알파벳순으로 가장 먼저 나오는 순만 생각하다가 틀렸다.
-> 알파벳 순서로 DFS를 돌리는 건 맞지만,
알파벳순으로 간다고 항상 모든 항공권을 다 쓴다는 보장이 없기 때문에 모든 경우에 대해 다 돌려야 한다.
- 근데 리턴하는 과정에서 문제가 발생했다.
경로를 찾았다고 True를 리턴한다고 해서 바로 끝나는게 아니라
해당 함수를 호출했던 함수들도 모두 종료되어야하므로
dfs의 결과가 True이면 그 부분에서 똑같이 True를 반환해줘야 경로를 찾았을 때 바로 종료할 수 있다.
-> dfs를 할 때 에러가 발생하면 항상 상태 공간 트리를 생각하면서, 리턴이 잘 이루어지는지 확인하자.
answer = []
temp = []
def dfs(begin, tickets) :
global answer, visited
if 0 not in visited :
return True
candi = [] # begin에서 갈 수 있는 것 찾기
for i in range(len(tickets)) :
if visited[i] == 0 :
if tickets[i][0] == begin :
candi.append(tickets[i] + [i])
candi.sort(key = lambda x : x[1]) # 알파벳 순으로 정렬
for begin, end, idx in candi :
visited[idx] = 1
answer.append(end)
if dfs(end, tickets) :
return True #주의 !!!! 이부분도 True를 리턴해줘야 내가 원하는대로 종료
visited[idx] = 0
answer.pop()
def solution(tickets):
global answer, visited, temp
visited = [0] * len(tickets)
answer.append("ICN")
dfs("ICN", tickets)
return answer
'Problem Solving > 프로그래머스' 카테고리의 다른 글
Lv3. 단속 카메라 (그리디) (0) | 2021.09.08 |
---|---|
Lv3. 섬 연결하기 (그리디) (0) | 2021.09.07 |
Lv3. 이중우선순위 큐 (0) | 2021.09.07 |
Lv3. 단어 변환 (DFS/BFS) (0) | 2021.09.06 |
위클리 챌린지 - 복서 정렬하기 (0) | 2021.09.06 |
댓글