Algorithm/프로그래머스_생각정리

프로그래머스_연속된 부분 수열의 합(python)

코친남 2023. 4. 10. 15:00

※ 접근

 sequence의 길이가 최대 백만이었기에 중첩 포문을 돌면 안되겠다는 생각이 제일 먼저 떠올랐다.  구간 합을 구하고 그 구간이 계속 변해가야하기에 left,right 투 포인터를 사용하기로 했다. 

 

※ 풀이

 1. 첫 시작과 나중을 구분했다. 그 이유는 처음에는 k를 같든 작든 크든 right가 오른쪽으로 이동해줘야 하기 때문이다.

(right는 left보다 같거나 큰 idx에 위치해야 하기 때문이다. )

2. temp == k라면 구간의 길이를 key로 하고 left, right를 사전형에 추가시켜준다. left와 right를 오른쪽으로 한 칸씩 이동시켜준다.

3. temp > k라면 left를 줄여준다.

4. temp < k라면 right를 한 칸 오른쪽으로 이동시켜준다. 

5. 마지막에 가장 작은 key를 찾아 첫 인덱스 별로 정렬 시켜주고 0번 인덱스를 answer에 넣어주면된다.

from collections import defaultdict

def solution(sequence, k):
    s = defaultdict(list)
    temp = 0
    left, right = 0, 0
    temp, i = 0, 0
    while right < len(sequence) and left < len(sequence): 
        if i == 0:
            temp = sequence[0]
            if temp == k:
                s[right+1-left].append([left,right])
            right += 1 # 처음에는 일단 right가 넘어가는게 맞음
            if not right < len(sequence):
                break
            temp += sequence[right]
            i += 1
        else:
            if temp == k:
                s[right+1-left].append([left,right])
                temp -= sequence[left]
                left += 1
                right += 1
                if not right < len(sequence):
                    break
                temp += sequence[right]
            elif temp > k:
                temp -= sequence[left]
                left += 1
            else:
                right += 1
                if not right < len(sequence):
                    break
                temp += sequence[right]
    
    min_len = min(s.keys())
    min_list = s[min_len]
    min_list = sorted(min_list, key=lambda x:x[0])
    answer = min_list[0]
    return answer

※ 회고

 화이팅!!!