본문 바로가기

Algorithm/DP(Dynamic Programing)

(Python3) - LeetCode (Medium) : 2017. Grid Game

반응형

https://leetcode.com/problems/grid-game

누적합을 이용한 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

열 개수 colLength, 첫 번째와 두 번째 행의 누적합을 구할 prefix_row0, prefix_row1, 정답 변수 result를 선언 후 적절히 초기화합니다.

📔 풀이과정

📑 robot1의 역할:

  • robot1은 게임에서 최대한 많은 점수를 가져가는 것이 목표입니다.
  • 하지만 단순히 점수를 많이 가져가는 것만이 아니라, robot2가 가져갈 점수를 최소화해야 합니다.
  • 따라서 robot1은 경로를 선택할 때 robot2가 가져갈 수 있는 점수의 최댓값을 최소화하는 방식으로 움직입니다.

📑 robot2의 역할:

  • robot2는 robot1이 지나간 후 남은 점수 중에서 최대한 많은 점수를 가져가려고 합니다.
  • robot2의 점수는 robot1이 선택한 경로에 따라 영향을 받습니다.

📑 경로 선택 기준:

  • robot1은 각 열에서 두 가지 선택이 가능합니다:
    • 오른쪽으로 이동 (row 0에 남은 점수): robot1이 row 0의 나머지 부분을 남겨둡니다.
    • 아래로 이동하여 오른쪽으로 이동 (row 1의 누적 점수): robot1이 row 1의 일부를 남겨둡니다.
  • robot2는 이 두 경우 중 더 큰 값을 선택합니다.

📑 result 갱신:

  • robot1은 모든 열에 대해 가능한 경로를 시뮬레이션하고, robot2가 얻을 수 있는 점수의 최댓값을 계산합니다.
  • robot1은 이 최댓값을 최소화하려고 하므로, result = min(result, max_points_second_robot)를 반복적으로 업데이트합니다.

 

📑 시간 복잡도

각 열마다 O(1)만에 경로 이동에 대한 점수를 계산하므로 O(n)입니다.

 

📑 공간 복잡도
각 grid의 한 행에 대해 두 변수를 선언했으므로 열 길이n만큼의 공간복잡도를 가집니다. 따라서 O(N)이 됩니다.

📔 정답 출력 | 반환

2번째 robot이 가질 수 있는 최대 점수를 반환합니다.


📕 Code

📔 Python3

class Solution:
    def gridGame(self, grid: List[List[int]]) -> int:
        colLength = len(grid[0])
        prefix_row0 = [0] * colLength
        prefix_row1 = [0] * colLength

        prefix_row0[0] = grid[0][0]
        prefix_row1[0] = grid[1][0]

        for i in range(1, colLength):
            prefix_row0[i] = prefix_row0[i-1] + grid[0][i]
            prefix_row1[i] = prefix_row1[i-1] + grid[1][i]

        total_row0_point = prefix_row0[-1]

        result = float('inf')

        for i in range(colLength):
            points_above = total_row0_point - prefix_row0[i]
            points_below = prefix_row1[i-1] if i > 0 else 0

            second_robot_max_point = max(points_above, points_below)
            result = min(result, second_robot_max_point)
        
        return result

*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.