Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 이진탐색
- fibo
- 디피
- 다이나믹프로그래밍
- XML주석
- ㅂ
- 안드로이드주석
- 주석
- 영어회화
- 안드로이드
- 바텀업
- 이진탐색 #나무 자르기
- XML
- 영어말하기
- 오픽점수잘받는방법
- 오픽노잼
- stack 스택
- 오픽
- opic
- 오픽공부법
- 오픽가격
- 탑다운
- 피보나치수열
- dp
- topdown
- dynamicProgramming
- 메모이제이션
- English
- 오픽노잼공부방법
Archives
RUBY
[BOJ] ABCDE 13023 본문
출처:: https://www.acmicpc.net/problem/13023
1. 문제 이해 및 해결과정
- DFS의 깊이를 구하는 문제 - 깊이가 4이상인가? |
2. 풀이방법
1.DFS
#ABCDE
#https://www.acmicpc.net/problem/13023
import sys
sys.stdin = open("input.txt","r")
input=sys.stdin.readline
sys.setrecursionlimit(10**6)
def DFS(v,depth):
global flag
visited[v]=1
if depth>=4: #깊이가 4이상이면 참
flag=1
return
for i in adj[v]:
if visited[i]==0:
DFS(i,depth+1)
visited[i]=0 #다음 방문시 처리를 위해
if flag==1:
return
if __name__=="__main__":
n,m=map(int,input().split())
adj = [[] * n for _ in range(n)]
visited = [0] * (n)
for _ in range(m):
a,b=map(int,input().split())
#adj[a][b]=adj[b][a]=1
adj[a].append(b)
adj[b].append(a)
# for x in adj:
# print(x)
flag=0
for i in range(n): #시작점
DFS(i,0)
visited[i]=0 #visited배열을 매번 만드는 것보다 다쓰고 0으로 초기화하면 메모리 아낌
if flag==1:
break
print(flag)
3. 오답원인
1. 시간초과 -오답코드
#ABCDE
#https://www.acmicpc.net/problem/13023
import sys
input=sys.stdin.readline
sys.setrecursionlimit(10**6)
def DFS(v,depth):
global flag
visited[v]=1
if depth>=4: #깊이가 4이상이면 참
flag=1
return
for i in range(n):
if visited[i]==0 and adj[v][i]==1: #방문안했고 연결되어 있으면
DFS(i,depth+1)
visited[i]=0 #다음 방문시 처리를 위해
if __name__=="__main__":
n,m=map(int,input().split())
adj = [[0] * n for _ in range(n)]
visited = [0] * (n)
for _ in range(m):
a,b=map(int,input().split())
adj[a][b]=adj[b][a]=1
flag=0
for i in range(n):
DFS(i,0)
visited[i]=0 #visited배열을 매번 만드는 것보다 다쓰고 0으로 초기화하면 메모리 아낌
print(visited)
if flag==1:
break
print(flag)
- 문제점1. 가지치기 깊이가 4이상이면 더이상 해 볼 필요가 없다.
for x in adj:
print(x)
- 문제점2. adj 에 인접행렬 배열을 만들었었는데 각 행에 연결된 정점만 추가하고 DFS에서 for문을 그 시작점과 연결된 정점 만큼만 돌리면 된다
for _ in range(m):
a,b=map(int,input().split())
#adj[a][b]=adj[b][a]=1
adj[a].append(b)
adj[b].append(a)
for i in adj[v]:
if visited[i]==0:
DFS(i,depth+1)
visited[i]=0 #다음 방문시 처리를 위해
if flag==1:
return
4. 알게된 점
- 그래프 처리할때 무조건 인접행렬 하는게 아니라 연결된 정점을 저장하는 식으로 풀이할 수 있다.
adj = [[] * n for _ in range(n)]
visited = [0] * (n)
for _ in range(m):
a,b=map(int,input().split())
#adj[a][b]=adj[b][a]=1
adj[a].append(b)
adj[b].append(a)
'PS > BOJ' 카테고리의 다른 글
[BOJ] 숨박꼭질3 13549 (0) | 2020.07.03 |
---|---|
[BOJ] 이분그래프 1707 ★ (0) | 2020.07.03 |
[BOJ] 나이트의 이동 7562 (0) | 2020.07.03 |
[BOJ] N과 M (12) 15666 (0) | 2020.07.01 |
[BOJ] N과 M (11) 15665 (0) | 2020.07.01 |
Comments