https://www.acmicpc.net/problem/17090
17090번: 미로 탈출하기
크기가 N×M인 미로가 있고, 미로는 크기가 1×1인 칸으로 나누어져 있다. 미로의 각 칸에는 문자가 하나 적혀있는데, 적혀있는 문자에 따라서 다른 칸으로 이동할 수 있다. 어떤 칸(r, c)에 적힌 문
www.acmicpc.net
단순하게 각 좌표마다
bfs를 써서
이동한 다음에
미로를 빠져나가는지 확인하는 방식이 있지만
이 방식은 제출하자마자 시간초과가 뜹니다.
이 문제가 골드3인걸 생각하면
그렇게 단순할리가 없죠.
이 문제는 dp를 함께 사용하는 방식입니다.
dp라고 해봤자, 해당 지점의 탈출여부를 판단하는 건데요.
만약에 위로 이동했을 때 좌표가
'나갈 수 있는 좌표'라는 표시가 있다면
굳이 더 나아가지 않아도
'나갈 수 있다'라는 걸 알 수 있습니다.
그러니 그걸 체크해주는 리스트를 만들고
그걸 이용해서 판단하면 됩니다.
#백준 17080번 미로탈출하기
import sys
sys.setrecursionlimit(10**5+300000)
dx=[-1,0,1,0]
dy=[0,1,0,-1]
N,M=map(int,input().split())
room=[[-1]*M for _ in range(N)]
check=[[-1]*M for _ in range(N)]
for i in range(N):
tmp=input().rstrip()
for j in range(M):
if tmp[j]=='U':
room[i][j]=0
elif tmp[j]=='R':
room[i][j]=1
elif tmp[j]=='D':
room[i][j]=2
elif tmp[j]=='L':
room[i][j]=3
def dfs(x,y):
go=room[x][y]
nx=x+dx[go]
ny=y+dy[go]
#미로를 벗어나면 1을 반환
if nx<0 or nx>=N or ny<0 or ny>=M:
return True
#해당 지점에서 나갈 수 있는지 없는지 여부가 판단되면 그 값을 반환
#나갈 수 있는 곳으로 가면 자연스럽게 나갈 수 있음
if check[nx][ny]>=0:
return check[nx][ny]
#아직 탐색이 안된 지역이라면
if check[nx][ny]==-1:
check[nx][ny]=-2
check[nx][ny]=dfs(nx,ny)
return check[nx][ny]
return 0
cnt=0
for x in range(N):
for y in range(M):
check[x][y]=dfs(x,y)
cnt+=check[x][y]
print(cnt)
이 문제는 dfs를 써야하더군요.
bfs를 쓰면 시간초과가 나버려서 안됩니다.
dfs로 쓸때는
재귀제한을 걸어놔야지
메모리초과,recursion error가 안뜹니다.
이런 달갑지 않지만
그래도 bfs,dfs를 사용할 때
dp를 함께 쓸 수 있는 방법을 익힐 수 있는 좋은 문제입니다.
[백준 16137번] 견우와 직녀(파이썬) (0) | 2022.08.28 |
---|---|
[백준 16920번] 확장게임(파이썬) (1) | 2022.08.27 |
[백준 6987번] 레이저 통신(파이썬) (1) | 2022.08.27 |
[백준 3089번] 네잎클로버(파이썬) (0) | 2022.08.26 |
[백준 20926번] 얼음 미로(파이썬) (2) | 2022.08.25 |
댓글 영역
Tabris4547님의
글이 좋았다면 응원을 보내주세요!
이 글이 도움이 됐다면, 응원 댓글을 써보세요. 블로거에게 지급되는 응원금은 새로운 창작의 큰 힘이 됩니다.
응원 댓글은 만 14세 이상 카카오계정 이용자라면 누구나 편하게 작성, 결제할 수 있습니다.
글 본문, 댓글 목록 등을 통해 응원한 팬과 응원 댓글, 응원금을 강조해 보여줍니다.
응원금은 앱에서는 인앱결제, 웹에서는 카카오페이 및 신용카드로 결제할 수 있습니다.