몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 2] 연속된 부분 수열의 합 {언어 : JavaScript} 본문

알고리즘

프로그래머스 [Lv. 2] 연속된 부분 수열의 합 {언어 : JavaScript}

스위태니 2024. 4. 5. 01:14

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/178870

 

프로그래머스

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

programmers.co.kr

정답 코드

function solution(sequence, k) {
    const n = sequence.length;
    let answer = [];
    let [left, right] = [0, 0];
    tmp = sequence[0];
    let minLen = 1000001;
    
    while (left <= right && right < n) {
        const currentLen = right - left + 1;
        if (tmp == k) {
            if (currentLen < minLen) {
                minLen = currentLen;
                answer = [left, right];
            }
            tmp -= sequence[left];
            left += 1;
        } else if (tmp < k) {
            right += 1;
            if (right < n) {
                tmp += sequence[right];
            }
        } else if (tmp > k) {
            tmp -= sequence[left];
            left += 1;
        }
    }
    return answer;
}

풀이 방법

  1. tmp 값을 수정하면서 k와 일치할 때 길이를 비교하고 최소 일 경우 answer에 넣어준다.
  2. 이분탐색과 비슷하지만 이분탐색은 정렬, right값이 맨 끝부터 시작한다.
  3. tmp 값이 작으면 right를 +1 크면 left를 +1한다.

느낀점

  • 투포인터 느낌인데, 아직 내 알고리즘 실력과 문제를 접근이 좋지 못하고 수준 또한 낮다는 것을 알았다.