[프로그래머스] 연속된 부분 수열의 합

    문제 정보

    https://school.programmers.co.kr/learn/courses/30/lessons/178870

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

     

    문제 분석

    누적 합 행렬을 사용하여 구간합을 빠르게 계산할 수 있도록 한다.

    수열은 오름차순으로 정렬되어 있고 연속된 수열의 합을 계산하기 때문에, 두 개의 포인터를 사용하여 목표 값 k 를 찾도록 한다

     

    앞쪽 포인터는 그대로 두고 뒤쪽 포인터를 이동시켜가며 k 값에 가까워지는지 확인한다.

    만약 구간 합이 k 보다 작다면 더 큰 수가 필요한 것 이기 때문에 뒤쪽 포인터를 더 뒤로 이동시킨다.

    만약 구간 합이 k 보다 크다면 구간 내에서 일정 값을 덜어내야 하기 때문에 작은 값들을 먼저 버리도록 앞쪽 포인터를 뒤로 이동시킨다

     

    만약 구간 합이 k 인 지점을 찾았다면 정답을 기록한다.

    이 때 구간합에 사용된 요소 개수가 작은 구간을 선택하도록 한다.

     

    풀이 코드

    def solution(sequence, k):
        answer = []
        end = 0
        internal_sum = 0
        length = len(sequence) 
        
        for start in range(length): 
            while internal_sum < k and end < length: 
                internal_sum += sequence[end]
                end += 1
                
            if internal_sum == k: 
                answer.append([start, end-1])
            internal_sum -= sequence[start]
        
        answer.sort(key=lambda x: (x[1]-x[0], x[0]))
        
        return answer[0]

    댓글