Programmers_DFS/BFS 여행경로(python)
프로그래머스 -여행경로 문제 입니다.
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/43164#
2. 분류 및 난이도
Programmers 문제입니다.
깊이/너비 우선 탐색 DFS/BFS 문제입니다.
Level 3난이도의 문제입니다.
3. 생각한 것들(문제 접근 방법)
- 백트래킹 방법을 사용하지 않으면 시간초과가 뜹니다.
- python에서 재귀 동작방식에 대한 이해가 부족하여 결과값들을 다 넣고 앞부분만 잘랐습니다. 개선이 필요합니다.
4. 접근 방법을 적용한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from collections import deque
def DFS(templi,dic,start,finish,v,answer):
#결과값은 항상 주어진 tickets 리스트의 크기 +1입니다.
if len(templi) == finish :
# 결과값을 다 넣어버립니다.
for i in range(len(templi)):
answer.append(templi[i])
return templi
#dictionary에 값이 있을 때
if start in dic :
for i in range(len(dic[start])) :
# 방문 처리가 되지 않은 것들을 돕니다.
if v[start][i]==0 :
#templi에 추가
templi.append(dic[start][i])
#방문처리
v[start][i] = 1
# 재귀
DFS(templi,dic,dic[start][i],finish,v,answer)
#맨 뒤의 값을 제거 및 방문처리 제거합니다.
templi.pop()
v[start][i] = 0
return templi
def solution(tickets):
answer = []
dic = {}
v = {}
finish = len(tickets)+1
#dic에 dic[출발지] = 도착지 값들을 deque형태로 저장합니다. 방문처리를 위한 v도 마찬가지로 저장합니다. 0은 방문하지 않은 것 1은 방문한 것입니다.
for i in range(len(tickets)):
start = tickets[i][0]
end = tickets[i][1]
if start not in dic:
dic[start] = deque()
v[start] = deque()
dic[start].append(end)
v[start].append(0)
else :
dic[start].append(end)
v[start].append(0)
#정렬
for i in dic :
dic[i] = sorted(dic[i])
DFS(["ICN"],dic,"ICN",finish,v,answer)
# 결과값들을 다 넣었으므로 앞부분을 자릅니다. 이미 정렬을 했기에 앞부분이 정답일 수 밖에 없습니다.
return answer[:finish]
5. 결과
필요시. c++ 짜드리겠습니다. 설명이 필요시 댓글달아주세요.
This post is licensed under CC BY 4.0 by the author.