새소식

알고리즘 테스트 ⏲/프로그래머스

[프로그래머스] 연속된 부분 수열의 합 풀이 / JavaScript

  • -
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

작성 코드 (1차 시도 / 통과)

function solution(sequence, k) {
    let [l, r] = [0, 0]
    let summed = sequence[l] // 현재 쌓여있는 합 (l~r위치 값의 합)
    const candidate = [] // 답안 후보
    while (r < sequence.length) {
        if (summed < k) summed += sequence[++r] // 합이 k보다 작으면 r이동
        else if (summed > k) summed -= sequence[l++] // 합이 k보다 크면 l이동
        else { // 합이 k라면 후보에 넣고 r과 l이동
            candidate.push([l, r])
            summed += sequence[++r]
            summed -= sequence[l++]
        }
    }
    // 후보 중 가장 차가 적은 것을 리턴
    return candidate.sort((a, b) => (a[1] - a[0]) - (b[1] - b[0]))[0] 
}

구현 로직(투 포인터)

 

1. 시작 위치 값 지정 l = 0, r = 0

2. summed에 초기 값 넣기

3. summed의 값에 따라 포인터 이동

  3-1. summed가 k보다 작으면(값을 추가해줘야 하므로) -> r포인터 이동

  3-2. summed가 k보다 크면(값을 뺴줘야 하므로) -> l포인터 이동

  3-3. summed가 k라면 후보에 넣고 이미 방문한 자리이므로 l과 r각각 이동

4. 후보 중 인덱스 차가 가장 적은 것을 리턴

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.