이문제도 DFS 백트래킹 메모이제이션를 이용해서 최적화 해야한다.
문제는 현재칸의 숫자만큼 상하좌우로 최대 몇번을 이동할수 있나를 체크하는거다 만일 싸이클일 경우도 체크해야 한다.
싸이클은 visited리스트를 만들어 체크한다.
코드를 읽으면서 방문한 코드를 True처리하는건 이해했는데 return전 False로 하는게 이해하기 어려웠지만.
현재칸에서 상하좌우 4개중 하나만 선택해서 이동해야 하므로 방문시 True, 떠날때는 False로 처리해야한다.
import sys
sys.setrecursionlimit(100000)
dx = [-1,1,0,0]
dy = [0,0,-1,1]
n,m = map(int,input().split())
graph = []
for i in range(n):
graph.append(list(map(str,input())))
visited = [[False for i in range(m)] for j in range(n)]
dp = [[0 for i in range(m)] for j in range(n)]
def dfs(x,y):
if visited[x][y] == True:
print(-1)
exit()
if dp[x][y] != 0:
return dp[x][y]
visited[x][y] = True
dp[x][y] = 1
for i in range(4):
nx = x + dx[i]*int(graph[x][y])
ny = y + dy[i]*int(graph[x][y])
if nx<0 or nx>=n or ny<0 or ny>=m:
continue
if graph[nx][ny] == 'H':
continue
dp[x][y] = max(dp[x][y],dfs(nx,ny) + 1)
visited[x][y] = False
return dp[x][y]
print(dfs(0,0))
다른 분 코드 위 분과 dp 갱신 위치가 다르다.
import sys
n, m = map(int, sys.stdin.readline().split())
graph = []
for i in range(n):
temp = sys.stdin.readline()
graph.append(temp[:-1])
visit = [[False for x in range(m)]for x in range(n)]
dp = [[0 for x in range(m)]for x in range(n)]
def dfs(x, y, dist):
global maxdist
maxdist = max(maxdist, dist)
move = int(graph[x][y])
adjlist = [[x-move, y], [x+move, y], [x, y-move], [x, y+move]]
for point in adjlist:
nx=point[0]
ny=point[1]
if nx >=0 and nx<n and ny >= 0 and ny < m and graph[nx][ny] != 'H' and dist + 1>dp[nx][ny]:
if visit[nx][ny] == False:
dp[nx][ny] = dist + 1
visit[nx][ny]=True
dfs(nx, ny, dist+1)
visit[nx][ny]=False
else:
print(-1)
exit()
global maxdist
maxdist = -1
dfs(0, 0, 1)
print(maxdist)
'코딩테스트' 카테고리의 다른 글
네트워크 - 깊이/너비 우선 탐색(DFS/BFS) - 프로그래머 (0) | 2025.06.05 |
---|---|
DFS, memoization - 타겟 넘버 (프로그래머스) (0) | 2025.06.03 |
2025 프로그래머스 코드챌린지 2차 예선완전범죄 (0) | 2025.05.31 |
2022 KAKAO BLIND RECRUITMENT신고 결과 받기 (0) | 2025.05.31 |
2023 KAKAO BLIND RECRUITMENT개인정보 수집 유효기간 (0) | 2025.05.31 |