[python][leetcode 2090] K Radius Subarray Averages

Dawon Seo·2023년 6월 20일
0
post-thumbnail

1. 문제

2. 내 풀이

class Solution:
    def getAverages(self, nums: List[int], k: int) -> List[int]:
        n = len(nums)
        d = (k * 2) + 1
        ans = [-1 for _ in range(n)]
        if n >= d:
            s = sum(nums[:d])
        else:
            return ans
        
        
        for i in range(k, n - k):
            if i != k:
                s -= nums[i - k - 1]
                s += nums[i + k]
            ans[i] = int(s/d)
        
        return ans

3-1. 누적합(Prefix Sum) 풀이

class Solution:
    def getAverages(self, nums: List[int], k: int) -> List[int]:
        if k == 0:
            return nums

        n = len(nums)
        averages = [-1] * n

        if 2 * k + 1 > n:
            return averages

        prefix = [0] * (n + 1)
        for i in range(n):
            prefix[i + 1] = prefix[i] + nums[i]

        for i in range(k, n - k):
            leftBound, rightBound = i - k, i + k
            subArraySum = prefix[rightBound + 1] - prefix[leftBound]
            average = subArraySum // (2 * k + 1)
            averages[i] = average

        return averages

3-2. 슬라이딩 윈도우(Sliding Window) 풀이

class Solution:
    def getAverages(self, nums: List[int], k: int) -> List[int]:
        averages = [-1] * len(nums)
        if k == 0:
            return nums

        n = len(nums)

        if 2 * k + 1 > n:
            return averages

        window_sum = sum(nums[:2 * k + 1])
        averages[k] = window_sum // (2 * k + 1)

        for i in range(2 * k + 1, n):
            window_sum = window_sum - nums[i - (2 * k + 1)] + nums[i]
            averages[i - k] = window_sum // (2 * k + 1)

        return averages

4. 느낀점

정수 부분만 취하는 거라면 나누기 후 int를 씌울 필요 없이 그냥 몫만 구했으면 됐다,, 왜 저렇게 했지
좀 더 깔끔한 코드를 짜는 연습을 하자! 굳이 for문 안에 조건 분기를 넣을 필요가 없었다

0개의 댓글