2024년 5월 14일 (화)
Leetcode daily problem
https://leetcode.com/problems/path-with-maximum-gold/?envType=daily-question&envId=2024-05-14
m x n 크기의 금광 격자에서 이 광산의 각 셀은 해당 셀의 금 양을 나타내는 정수를 가지며, 비어 있으면 0이다.
다음 조건에 따라 수집할 수 있는 최대 골드 금액을 반환한다.
dfs (깊이 우선 탐색)
2차원 그리드에서 금광을 탐험하여 얻을 수 있는 최대 금의 양을 찾는 문제이다. 주어진 그리드는 행(row)과 열(column)로 이루어져 있으며, 각 셀은 금의 양을 나타낸다. 시작점에서 출발하여 상하좌우로 이동할 수 있으며, 한 번 방문한 셀은 다시 방문할 수 없다.
이때, 금을 얻을 수 있는 경로 중에서 가장 많은 금을 얻을 수 있는 경로의 금의 양을 반환해야 하는데 전형적인 DFS로 풀 수 있는 문제이다.
주어진 그리드에서 0을 방문할 수 없으므로, 0 이아닌 그리드를 모두 방문하면서, 이동할 수 있는 상하좌우로 움직여서 그리드 안의 셀의 금의 값을 더하고 최대값을 업데이트 해간다.
방문했던 셀을 다시 재방문하지 않기 위해서 방문한 셀을 저장하는 집합(set)을 계속 업데이트 한다.
최종적으로 업데이트된 금의 합을 반환한다.
class Solution:
def getMaximumGold(self, grid: List[List[int]]) -> int:
ROWS, COLS = len(grid), len(grid[0])
visited = set()
def dfs(x,y):
if x<0 or x>=ROWS or y<0 or y>=COLS or grid[x][y]==0 or (x,y) in visited:
return 0
visited.add((x,y))
maxGold = 0
for dx, dy in [(1,0), (-1,0), (0,1), (0,-1)]:
next_x, next_y = x+dx, y+dy
maxGold = max(maxGold, dfs(next_x, next_y))
visited.remove((x,y))
return grid[x][y] + maxGold
ans = 0
for r in range(ROWS):
for c in range(COLS):
if grid[r][c]!=0:
ans = max(ans, dfs(r,c))
return ans
시간 복잡도
모든 셀을 한 번씩 방문해야 하므로 전체 코드의 시간복잡도는 O(M*N)이다. M:행의 수, N:열의 수 이다.
공간 복잡도
방문한 그리드의 셀을 기록하기 위해서 set 자료구조를 사용하고 있고, 최대한 방문할 수 있는 셀의 수와 같ㅌ으므로 공간복잡도 또한 O(M*N) 이다.