티스토리 뷰
반응형
문제:www.acmicpc.net/problem/16929
N,M=map(int,input().split())
arr=[list(map(str,input()))for _ in range(N)]
visited = [[False]*M for _ in range(N)]
dy=[0,0,1,-1]
dx=[1,-1,0,0]
flag=False
def scope(y,x):
if y>=0 and y<N and x>=0 and x<M:
return True
else:
return False
def dfs(y,x,py,px,ball):
if visited[y][x]==1:
return True
visited[y][x]=True
for i in range(4):
ny=y+dy[i]
nx=x+dx[i]
if ny!=py or nx!=px:
if scope(ny,nx) and arr[ny][nx]==ball :
if dfs(ny,nx,y,x,ball): return True
return False
for i in range(N):
for j in range(M):
if visited[i][j]:
continue
if dfs(i,j,0,0,arr[i][j]):
flag=True
break
print("Yes") if flag else print("No")
참고:https://shinbian11.tistory.com/60
위의 그림은 싸이클이 있는 경우와 없는 경우의 예를 보여준다.
싸이클이 있는 경우에는 방문한 적 있는 점을 다시 만날 경우가 싸이클이 존재하는 경우이다.
단 바로 이전의 점을 방문할 우려가 있어서 if ny!=py or nx!=px: 라는 조건문을 걸어 주었다.
그러면 ny==py and nx==px 인 경우를 제외하고 주변의 모든 점을 깊이 우선 순회를 할 수 있기 때문이다.
1
2
3
4
|
if dfs(i,j,0,0,arr[i][j]):
flag=True
break
print("Yes") if flag else print("No")
|
cs |
그리고 싸이클 존재유무만 알면 되므로 싸이클이 존재하면 flag=True로 두고 반복문을 나간다.
싸이클 존재 유무에 따른 결과값을 출력하면 된다.
반응형
'알고리즘 > 백준' 카테고리의 다른 글
16964번 DFS 스페셜 저지 백준 파이썬 (0) | 2020.12.12 |
---|---|
16940번 BFS 스페셜 저지 백준 파이썬 (0) | 2020.12.12 |
16947번 서울 지하철 2호선 백준 파이썬 (0) | 2020.12.11 |
이분 그래프 1707번 백준 파이썬 (0) | 2020.12.10 |
14391번 종이조각 백준 파이썬 (3) | 2020.12.09 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 파이썬
- PostgreSQL
- Pattern
- 자바
- Celery
- setattr
- Collections
- 알고리즘
- Linux
- docker
- 카카오
- Command Line
- 그래프
- Spring
- DRF
- docker-compose
- 면접
- dockerignore
- django
- env
- headers
- BFS
- ubuntu
- 백준
- 프로그래머스
- Python
- Java
- 2021 KAKAO BLIND RECRUITMENT
- postgres
- thread
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함