Python_알고리즘/Gold III
1937. [Python]욕심쟁이 판다
최근영
2024. 9. 20. 18:36
1. 문제
2. 접근 방법
- 시간 제한: 2초
- 메모리 제한: 256MB
- 재귀
- 깊이우선 탐색
- DP
3. 파이썬 코드
import sys
# 재귀 제한
sys.setrecursionlimit(10000)
# DFS 실행
def DFS(start):
global max_value
global N
# 온 경로가 방문한 곳일 경우
if visited[start[0]][start[1]] != 0:
# 현재 돌아온 경로를 리턴
return visited[start[0]][start[1]]
# 시작 값 1로 초기화
visited[start[0]][start[1]] = 1
for k in range(4):
ny = direction[k][0] + start[0]
nx = direction[k][1] + start[1]
# 범위 내에 있는 경우
if 0 <= ny < N and 0 <= nx < N:
# 다음 가야할 값이 현재 값보다 작은 경우
if matrix[ny][nx] < matrix[start[0]][start[1]]:
# 재귀 실행 하며 현재 값이랑 재귀해서 돌아온 값 + 1 한 값을 갱신
visited[start[0]][start[1]] = max(visited[start[0]][start[1]],DFS((ny,nx))+1)
# 최종적으로 갱신된 현재 위치값 반환
return visited[start[0]][start[1]]
input = sys.stdin.readline
N = int(input())
direction = [(0,-1),(-1,0),(0,1),(1,0)]
matrix = []
max_value = 0
visited = [[0] * (N) for _ in range(N) ]
for _ in range(N):
matrix.append(list(map(int,input().split())))
for i in range(N):
for j in range(N):
# 방문하지 않았을 경우 DFS 실행
if visited[i][j] == 0:
max_value = max(max_value,DFS((i,j)))
print(max_value)
4. 문제를 풀고난 후 생각
- 처음 접근 한 방식은 현재 위치에서 큰 값이 있는경우 이동하며 그 위치를 갱신해주는 방식으로 접근을 진행함
- 그러다 보니 결국 새로운 값이 갱신될 경우 그 주위 값들도 모두 갱신됐기 때문에 시간초과가 발생함
- 새로 접근한 방식으로는 현재 위치에서 어디까지 최대 갈 수 있는지를 파악하는 것으로 해결함
- 현재 위치에서 어느 깊이까지 갈 수 있는지 재귀를 통해 접근한 후 초기로 설정한 0 이 아닌 경우 이미 탐색을 했기 때문에 접근하지 않고 바로 return 처리될 수 있도록 함
- return + 1 한 값이랑 현재 위치값 중 max 값을 계속해서 갱신해줌
5. 문제를 푸는데 도움이 되는 지식
- 깊이 우선 탐색
- 재귀
- DP