백준 1937 문제 링크: https://www.acmicpc.net/problem/1937
📑 문제 설명
1. n x n 크기의 대나무숲이 있음
2. 각 칸에는 대나무의 양이 표시되어 있음
3. 판다는 특정 칸에서 대나무를 먹기 시작하며 상하좌우로 움직을 수 있으나 현재 위치보다 다음 위치에 있는 대나무의 양이 더 많아야 함
입력: 첫째 줄에는 n의 크기가 주어지고 둘째 줄부터 대나무 숲의 정보가 주어짐
출력: 판다가 이동할 수 있는 최대 칸 수
💡 문제 해결 방법
알고리즘: dfs
알고리즘 선택 이유
예외처리
스터디 내용
💻 코드
import sys
from collections import deque
def bfs(queue, dist):
max_dist = 0
while(queue):
x, y = queue.popleft()
max_dist = max(max_dist, dist[x][y])
adj_list = [[x - 1, y], [x + 1, y], [x, y - 1], [x, y + 1]]
for nx, ny in adj_list:
if nx >= 0 and nx<n and ny>=0 and ny<n:
if graph[x][y] < graph[nx][ny]: # 현 위치보다 다음 위치의 대나무 양이 많다면 갈 수 있음
inedge[nx][ny] -=1
dist[nx][ny] = dist[x][y] + 1
if inedge[nx][ny] == 0:
queue.append((nx, ny))
print(max_dist)
n = int(sys.stdin.readline())
graph = [[0 for x in range(n)]for x in range(n)]
inedge = [[0 for x in range(n)]for x in range(n)]
for i in range(n):
graph[i] = list(map(int, sys.stdin.readline().split()))
# inedge 조사
# 방향성: 적은 양의 대나무 --> 많은 양의 대나무
for x in range(n):
for y in range(n):
d = graph[x][y] # 현재 위치의 대나무양
adj_list = [[x - 1, y], [x + 1, y], [x, y - 1], [x, y + 1]]
for nx, ny in adj_list:
if nx >=0 and nx<n and ny>=0 and ny<n:
nd = graph[nx][ny] # 다음 위치의 대나무양
if d > nd:
inedge[x][y] += 1
queue = deque()
dist = [[0 for x in range(n)]for x in range(n)]
for i in range(n):
for j in range(n):
if inedge[i][j] == 0:
queue.append((i, j))
dist[i][j] = 1
bfs(queue, dist)
💟 추가적으로 알게 된 점