본문 바로가기
알고리즘 배우기

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

by cwin 2024. 8. 19.

[참고자료] - https://ksb-dev.tistory.com/302

 

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

투포인터 문제입니다. 투포인터란, 두 가지의 포인터를 사용해 배열에서 조건과 일치하는 연속된 부분을 찾을 수 있는 방법입니다. 조건에 맞춰 서로 다른 두 가지의 포인터를 움직여야 합니다.

ksb-dev.tistory.com

위와 같은 방식으로 2개의 pivot을 생각하고 풀었다.

 

1. 런타임이 발생하는 코드

def solution(sequence, k):
    l = len(sequence)
    diff = l
    answer = 0
    small = 0
    total = []
    sum_ = 0
    for pivot in range(l):
        total.append(sequence[pivot])
        sum_ += sequence[pivot]
        if sum_ < k:
            continue
        while (1):
            if sum_ < k:
                break
            elif sum_ > k:
                sum_ -= total.pop(0)
                small += 1
                continue
            else:
                if pivot-small < diff:
                    answer = [small, pivot]
                    diff = pivot - small
                    break
                break
    return answer

 

2.개선된 코드

def solution(sequence, k):
    l = len(sequence)
    diff = l  # 초기화할 때 리스트의 길이로 설정
    answer = []
    small = 0
    sum_ = 0

    for pivot in range(l):
        sum_ += sequence[pivot]

        while sum_ > k and small <= pivot:
            sum_ -= sequence[small]
            small += 1

        if sum_ == k:
            if pivot - small < diff:
                answer = [small, pivot]
                diff = pivot - small

    return answer

 

가장 큰 차이점은 1번에서는 small이라고 가장 첫 시작 pivot과, total이라는 list에서 계속 값을 유지하고 있었다는 점이 가장 큰 잘 못된 점이었다.

small을 이용하여, pop대신 -sequene[small] 대체하여 불필요한 리스트, 연산을 제거했다.

 

그다음, while 조건문 생성이다. if-elif-else문 구조에서 while 조건문 하나로 간단하게 원소를 줄여야할 경우를 걸러낼 수 있었다.