알고리즘
[Python] 프로그래머스 - 연속된 부분 수열의 합
BKM
2024. 7. 19. 12:38
문제
https://school.programmers.co.kr/learn/courses/30/lessons/178870
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
$5 \leq \text{len(sequence)} \leq 1,000,000$ 의 제한사항이 있기 때문에, 시간초과에 유의해서 코드를 작성해야한다.
def solution(sequence, k):
l,r = 0,0
s = 0
answers = []
for i in range(len(sequence)):
s+=sequence[i]
if s==k:
answers.append([l,r])
s-=sequence[l]
l+=1
elif s>k:
while s>k:
s-=sequence[l]
l+=1
if s==k:
answers.append([l,r])
r+=1
return sorted(answers,key=lambda x:(x[1]-x[0],x[0]))[0]
sequence를 순회하면서 s(합)에 현재 값을 추가해 원소의 합을 k와 비교한다.
- k와 같은 경우
- answers에 추가하고 더 있을지도 모르는 정답을 계산하기 위해 left index를 하나 증가시키고 그 전의 index에 해당하는 원소값을 s에서 빼준다
- k보다 큰 경우
- 이미 해당 left index에서는 정답이 나올 수 없기 때문에 s가 k보다 작아질때 까지 left index를 증가시키고 해당 원소값을 s에서 빼준다
- 그 후에 k와 비교해 같은 경우에는 answers에 추가한다
- 순회가 끝난 후에 우선순위에 따라 answers를 정렬하고 첫번째 원소를 return