[Leetcode] 2145. Count the Hidden Sequences

이강혁·2024년 6월 16일
0

leetcode

목록 보기
3/17

https://leetcode.com/problems/count-the-hidden-sequences/description/

어떤 수열에 대해서 각 항의 차를 저장한 수열이 제공되고, 수열이 가질 수 있는 최솟값과 최댓값이 주어진다. 그래서 해당 조건을 만족하는 수열이 몇 가지 있을 수 있는지 구하는 문제이다.

접근은 첫 항을 i로 두고 i를 기준으로 해서 나머지 항이 어떻게 되는지 계산할 수 있도록 차가 저장된 배열 differences를 누적합 시켰다.
그러고 누적합이 저장된 배열의 최솟값과 최댓값을 뽑아낸 후 조건에 주어진 lower와 upper 즉 수열이 가질 수 있는 최솟값과 최댓값을 비교하면서 첫 항이 될 수 있는 수의 범위를 구하고 그 범위의 크기를 반환했다.

class Solution:
    def numberOfArrays(self, differences: List[int], lower: int, upper: int) -> int:
        sumDif = [0] * len(differences)
        sumDif[0] = differences[0]

        for i in range(1, len(differences)):
            sumDif[i] = sumDif[i-1] + differences[i]
        
        minV = min(sumDif)
        maxV = max(sumDif)

        start = lower - minV
        end = upper - maxV

        return end - start + 1 if end > start else 0

그리고 틀렸다.
difference가 [-40]으로 주어지고, lower는 -46, upper는 53이 주어졌을 때 구해야하는 답은 60인데 내 코드는 100을 반환했다. 근데 생각해보니까 항이 1개이면 lower와 upper사이 범위 전부 다 가능할텐데 그래서 100이 맞아야할 것 같은데 왜 아닌지 모르겠다.

일단 코드는

class Solution:
    def numberOfArrays(self, differences: List[int], lower: int, upper: int) -> int:
        sumDif = 0

        minV = 0
        maxV = 0
        for d in differences:
            sumDif += d
            minV = min(minV, sumDif)
            maxV = max(maxV, sumDif)


        start = lower - minV
        end = upper - maxV

        return end - start + 1 if end >= start else 0

이렇게 수정했고 통과는 했는데 왜 이렇게 돼야하는지는 아직 이해를 못했다.

profile
사용자불량

0개의 댓글