문제 정보
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]
댓글