n×n크기의 격자 정보가 주어졌을 때, 시작점을 적절하게 잡아 상하좌우로 인접한 칸으로계속 칸에 적혀있는 정수값이 커지도록이동한다고 했을 때 밟고 지나갈 수 있는 최대 칸의 수를 구하는 프로그램을 작성해보세요.
입력 형식
첫 번째 줄에는n이 주어집니다. 두 번째 줄부터n개의 줄에 걸쳐 각 행에 해당하는n개의 정수 값이 공백을 사이에 두고 주어집니다.
1 ≤n≤ 500
1 ≤ 주어지는 숫자 ≤ $10^9$
출력 형식
가능한 경로의 숫자들 중 최솟값의 최댓값을 출력합니다.
입출력 예제
예제1
입력:
3 2 2 1 3 1 2 4 1 2
출력:
3
예제2
입력:
3 5 1 3 6 1 4 7 2 3
출력:
4
예제 설명
백트래킹으로 풀거나 DP로 풀면 된다.
백트래킹 방법
import sys
sys.stdin=open('input.txt', 'r')
defin_range(x, y):return0 <= x and x < n and0 <= y and y < n
# 정수값이 작은 칸부터 순서대로 보며# 4방향에 대해 최적의 칸 수를 계산합니다.
dxs = [-1, 1, 0, 0]
dys = [ 0, 0, -1, 1]
# (x, y)에서 출발하여 조건을 만족하며# 도달할 수 있는 칸의 수 중# 최대 칸의 수를 구합니다.defDFS(x, y):# 이미 계산해본적이 있다면# 그 값을 바로 반환합니다.if dp[x][y] != -1:
return dp[x][y]
# 기본값은 자기자신이 됩니다.
best = 1# 현재 (x,y) 위치를 1번 세고 시작 for dx, dy inzip(dxs, dys):
nx = x + dx
ny = y + dy
if in_range(nx, ny) and board[nx][ny] > board[x][y]:
best = max(best, DFS(nx, ny) + 1) # 다음칸으로 이동하므로 +1
dp[x][y] = best
return dp[x][y]
if __name__=="__main__":
n = int(input())
board = [list(map(int, input().split())) for _ inrange(n)]
dp = [[-1] * n for _ inrange(n)]
# 각 칸에 시작했을 떄# 최대로 이동할 수 있는 칸의 수 중 # 최댓값을 갱신합니다.
ans = 0for i inrange(n):
for j inrange(n):
ans = max(ans, DFS(i, j))
print(ans)
DP 방법
import sys
sys.stdin=open('input.txt', 'r')
dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1]
defin_range(nx, ny):return0<=nx<n and0<=ny<n
if __name__=="__main__":
n = int(input())
board = [list(map(int, input().split())) for _ inrange(n)]
dp = [[0] * n for _ inrange(n)]
cells = []
ans = 0# 각 칸에 적혀있는 정수값 기준으로# 오름차순이 되도록 칸의 위치들을 정렬합니다.# 편하게 정렬하기 위해# (칸에 적혀있는 값, 행 위치, 열 위치) 순으로 넣어줍니다.for i inrange(n):
for j inrange(n):
cells.append((board[i][j], i, j))
# 오름차순으로 정렬을 진행합니다.
cells.sort()
# 처음 DP 값들은 전부 1로 초기화해줍니다. (해당 칸에서 시작하는 경우)for i inrange(n):
for j inrange(n):
dp[i][j] = 1# 정수값이 작은 칸부터 순서대로 보며# 4방향에 대해 dp 값을 갱신해줍니다.for _, x, y in cells:
# 인접한 4개의 칸에 대해 갱신을 진행합니다.for dx, dy inzip(dxs, dys):
nx = x + dx
ny = y + dy
if in_range(nx, ny) and board[nx][ny] > board[x][y]:
dp[nx][ny] = max(dp[nx][ny], dp[x][y] + 1)
# 전체 수들 중 최댓값을 찾습니다.for i inrange(n):
for j inrange(n):
ans = max(ans, dp[i][j])
print(ans)