일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- LCS
- 파이썬
- Android
- permutation
- 9095
- 1260
- 코틀린
- 11053
- 백준
- expo
- 코테
- 안드로이드
- 최소공배수
- 나머지
- 앱
- 괄호
- lcm
- Kotlin
- Python
- 순열
- 매일11시
- Combination
- 1182
- 홈화면
- 11054
- itertools
- 뒤로가기
- 11057
- 6603
- 11기
Archives
- Today
- Total
황소개발자
백준 1260 파이썬 python : DFS와 BFS @@황소처럼 우직하게@@ 탐색순서 주의안하면 시간초과납니다;; 최적화하기. 본문
백준 문제 풀이
백준 1260 파이썬 python : DFS와 BFS @@황소처럼 우직하게@@ 탐색순서 주의안하면 시간초과납니다;; 최적화하기.
hjp845 2020. 2. 20. 23:17반응형
이 글에서는 dfs와 bfs의 개념을 설명하지 않습니다.
dfs bfs 공부하시구 이 글봐주시면 '최적화' 라는 위대함에 알게됩니다.
오랜만에 복습겸 이 문제를 접하게되었는데, 계속 시간초과가 나는겁니다..
n, m, v = list(map(int, input().split()))
adj = [[0 for i in range(n + 1)] for j in range(n + 1)]
for i in range(m):
a, b = map(int, input().split())
adj[a][b] = 1
adj[b][a] = 1
def dfs(v, hist, adj):
hist.append(v)
for i in range(1, n + 1):
if i not in hist and adj[v][i]:
hist = dfs(i, hist, adj)
return hist
def bfs(v, adj):
q = [v]
hist = [v]
while q:
now = q.pop(0)
for i in range(1, n + 1):
if i not in hist and adj[now][i]:
q.append(i)
hist.append(i)
return hist
print(' '.join(map(str, dfs(v, [], adj))))
print(' '.join(map(str, bfs(v, adj))))
1시간 삽질했네요.. ㅠㅠ 해답은 아래 코드입니다.
n, m, v = map(int, input().split())
adj = [[0 for i in range(n + 1)] for j in range(n + 1)]
for i in range(m):
a, b = map(int, input().split())
adj[a][b] = 1
adj[b][a] = 1
def dfs(v, hist, adj):
hist.append(v)
for i in range(1, n + 1):
if adj[v][i] and i not in hist:
hist = dfs(i, hist, adj)
return hist
def bfs(v, adj):
q = [v]
hist = [v]
while q:
now = q.pop(0)
for i in range(1, n + 1):
if adj[now][i] and i not in hist:
q.append(i)
hist.append(i)
return hist
print(' '.join(map(str, dfs(v, [], adj))))
print(' '.join(map(str, bfs(v, adj))))
차이가 뭔지 보이시나요? ㅋㅋㅋ
if adj[v][i] and i not in hist:
검색 순서입니다. 위 코드가 올바른 순서이고요.
if i not in hist and adj[v][i]:
위 코드와 같이 쓰면 시간초과가 납니다.
이런 문제에서 세세하게 시간따질줄 몰랐는데;;
하여튼, and 문에 대해서 더 알아볼게요
가령 A and B 일 때, A 가 false 이면 B는 확인하지 않고 넘어갑니다.
바로 이 차이때문에 시간초과가납니다.
최적화할 때, 최대한 A에 false가 많이 발생하는걸로 위치시켜야하는 것이죠.
아 그리고 마지막 출력문은
print(*dfs(v, [], adj))
print(*bfs(v, adj))
이렇게 쓰는게 더 깔끔합니다.
이게 시간초과를 일으키는지 온갖 의심이 들어서 map 쓰고 난리였네요
--
ps)
10일 뒤 더 깔끔해지고, 시간복잡도도 내려가고, 성장한 코드는 아래 글에 다시 포스팅했습니다.
반응형
'백준 문제 풀이' 카테고리의 다른 글
백준 6603 파이썬 python : 독일 로또 @@황소처럼 우직하게@@ 조합 itertools combinations permutation 사용법 + 런타임에러 해결 (0) | 2020.02.21 |
---|---|
백준 11724 파이썬 python : 연결 요소의 개수 @@황소처럼 우직하게@@ 런타임에러 해결, 시간초과 해결 (0) | 2020.02.21 |
LCS 최장 공통 부분 수열 : 3개일 때 길이 뿐만 아니라, 부분문자열까지 찾아내기 @@황소처럼 우직하게@@ (0) | 2020.02.20 |
백준 1958 파이썬 python : LCS 3 @@황소처럼 우직하게@@ (0) | 2020.02.20 |
백준 9252 파이썬 python LCS 2 @@황소처럼 우직하게@@ (0) | 2020.02.20 |
Comments