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

junhyeong04·2023년 9월 15일

codingTestPython

목록 보기
10/53

📁문제 설명

비내림차순으로 정렬된 수열이 주어질 때, 다음 조건을 만족하는 부분 수열을 찾으려고 합니다.

  • 기존 수열에서 임의의 두 인덱스의 원소와 그 사이의 원소를 모두 포함하는 부분 수열이어야 합니다.
  • 부분 수열의 합은 k입니다.
  • 합이 k인 부분 수열이 여러 개인 경우 길이가 짧은 수열을 찾습니다.
  • 길이가 짧은 수열이 여러 개인 경우 앞쪽(시작 인덱스가 작은)에 나오는 수열을 찾습니다.

수열을 나타내는 정수 배열 sequence와 부분 수열의 합을 나타내는 정수 k가 매개변수로 주어질 때, 위 조건을 만족하는 부분 수열의 시작 인덱스와 마지막 인덱스를 배열에 담아 return 하는 solution 함수를 완성해주세요. 이때 수열의 인덱스는 0부터 시작합니다.


📁제한 사항

  • 5 ≤ sequence의 길이 ≤ 1,000,000
  • 1 ≤ sequence의 원소 ≤ 1,000
  • sequence는 비내림차순으로 정렬되어 있습니다.
  • 5 ≤ k ≤ 1,000,000,000
  • k는 항상 sequence의 부분 수열로 만들 수 있는 값입니다.

📁풀이 방법

def solution(sequence, k):
	# 시작, 마지막 인덱스
    start, end = 0, 0
    # k와 값을 비교할 변수
    res_sum = sequence[0]
    # sequence의 배열 lengh
    idx = len(sequence)
    # 값을 저장할 변수
    arr = [0, 1000001]
    # start, end의 값이 sequence의 길이를 넘지 않을 때 루프
    while start < idx and end < idx:
        if res_sum == k:
        	# 새로 찾은 값의 인덱스 길이 차이가 arr에 저장된 값의 인덱스 길이 차이보다 작다면
            # arr에 값 저장
            if end - start < arr[1] - arr[0]:
                arr = [start, end]
            
            # sequence[0]로 시작했기 때문에 연산 후 start를 더해줌
            res_sum -= sequence[start]
            start += 1
        elif res_sum > k:
            res_sum -= sequence[start]
            start += 1
        else:
            end += 1
            if end < idx:
                res_sum += sequence[end] 
        
    return arr

0개의 댓글