[파이썬] 백준 1937: 욕심쟁이 판다 (골드3)
1937번: 욕심쟁이 판다
n × n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에
www.acmicpc.net
문제
풀이
0. 방향성 생각
- DFS 사용
1. 입력
import sys
sys.setrecursionlimit(10**6)
input = lambda : sys.stdin.readline().rstrip()
n = int(input())
arr = [list(map(int,input().split())) for _ in range(n)]
visit = [[-1]*n for _ in range(n)]
2. 함수 정의
step = [(1,0),(0,1),(-1,0),(0,-1)]
def dfs(x,y):
if visit[y][x] != -1:
return visit[y][x]
visit[y][x] = 0
for dx,dy in step:
nx = x + dx
ny = y + dy
if 0<=nx<n and 0<=ny<n and arr[y][x] < arr[ny][nx]:
visit[y][x] = max(visit[y][x],dfs(nx,ny))
visit[y][x] += 1
return visit[y][x]
- 첫 방문이면 계속 재귀통해서 DFS 실행 못시킬때까지 들어감.
- 첫 방문에서는 if문을 통과못하고 visit = 1
- 그 상위노드에서는 다른 여러 자식노드를 통해 구한 visit값들 중 최대값 visit[y][x]가 기록되어있는데 이 값과 dfs(nx,ny)를 비교해서 큰 값을 선택함.
3. 출력
for i in range(n):
for j in range(n):
if visit[i][j] == -1:
dfs(j,i)
print(max(map(max,visit)))
- 탐색이 아직 안된 곳에서 DFS 실행
전체코드
import sys
sys.setrecursionlimit(10**6)
input = lambda : sys.stdin.readline().rstrip()
n = int(input())
arr = [list(map(int,input().split())) for _ in range(n)]
visit = [[-1]*n for _ in range(n)]
step = [(1,0),(0,1),(-1,0),(0,-1)]
def dfs(x,y):
if visit[y][x] != -1:
return visit[y][x]
visit[y][x] = 0
for dx,dy in step:
nx = x + dx
ny = y + dy
if 0<=nx<n and 0<=ny<n and arr[y][x] < arr[ny][nx]:
visit[y][x] = max(visit[y][x],dfs(nx,ny))
visit[y][x] += 1
return visit[y][x]
for i in range(n):
for j in range(n):
if visit[i][j] == -1:
dfs(j,i)
print(max(map(max,visit)))
코멘트
DFS 너무 헷갈림
'Algorithm > Graph' 카테고리의 다른 글
[파이썬] 백준 1963 : 소수 경로 (골드4) (0) | 2023.09.06 |
---|---|
[파이썬] 백준 6087 : 레이저 통신 (골드3) (0) | 2023.09.06 |
[파이썬] 백준 1400 : 화물차 (골드2) (0) | 2023.09.03 |
[파이썬] 백준 1520 : 내리막길 (골드3) (0) | 2023.08.25 |
[파이썬] 백준 13023 : ABCDE (골드5) (0) | 2023.08.25 |
[파이썬] 백준 1327 : 소트게임 (골드5) (0) | 2023.08.24 |
[파이썬] 프로그래머스 : 경주로 건설 (Lv.3) (0) | 2023.08.22 |
댓글