ALGORITHM/Inflearn

효율성(투포인터 알고리즘) - 연속 부분수열 1

Harimad 2022. 2. 18. 23:01

문제

 

배열 1 2 1 3 1 1 1 2이 있다

연속 부분 수열의 합이 특정 숫자(6)인 경우가 몇 번 나오는지 함수로 만들어 보시오.

{2, 1, 3}, {1, 3, 1, 1}, {3, 1, 1, 1} 로 3가지 이다.

 

입력예제 1          입력예제2

1 2 1 3 1 1 1 2     1 1 1 2 4

출력예제 1          출력예제2

3                       1

 

 

풀이

lt와 rt를 크기 비교할 일이 없이 rt는 증가하면서 sum에 더하는 일을 하면 되고,

lt는 증가하면서 sum에서 빼는 일을 하면 된다.

sum이 음수로 갈 일을 없으니 상관없다.

이론 설명처럼 rt가 증가하고 lt가 따라가는 것처럼 코드를 짜려면 아래처럼 하는게 더 이해하기 좋은 코드 이다.

코드1

function solution(m, arr) {  
  let answer = lt = sum = 0;

  for (let rt = 0; rt < arr.length; rt++) {
    sum += arr[rt];
    while (sum > m) sum -= arr[lt++];
    if (sum === m) answer++;
  }
  return answer;
}
console.log(solution(6, [1, 1, 1, 2, 4])); // 1
console.log(solution(6, [1, 2, 1, 3, 1, 1, 1, 2])); // 3
console.log(solution(2, [1, 1, 1])); // 2

코드2

//더 나은 방법
function solution(m, arr) {
  let answer = 0, l = sum = 0;
  
  for (let r = 0; r < arr.length; r++) {
   sum += arr[r];
    while (sum >= m) {
      if (sum === m) {
        answer++;
      }
      sum -= arr[l++];
    }
  }
  return answer;
}
console.log(solution(6, [1, 1, 1, 2, 4])); // 1
console.log(solution(6, [1, 2, 1, 3, 1, 1, 1, 2])); // 3
console.log(solution(2, [1, 1, 1])); // 2

}

//----------------------------------------------//

function solution(m, arr) {
  let answer = 0,
    l = 0,
    sum = 0;
  for (let r = 0; r < arr.length; r++) {
    sum += arr[r];
    if (sum === m) answer++;
    while (sum >= m) {
      sum -= arr[l++];
      if (sum === m) answer++;
    }
  }
  return answer;
}
console.log(solution(6, [1, 1, 1, 2, 4])); // 1

//----------------------------------------------//

function solution(m, arr){
  let answer = 0, lt = rt = 0;
  let sum = arr[lt];

  while (rt < arr.length) {
    if (sum === m) {
      answer++;
      sum -= arr[lt];
      lt++;
    } else if (sum < m) {
      rt++;
      sum += arr[rt];
    } else {
      sum -= arr[lt];
      lt++;
    }
  }
  return answer;
}
console.log(solution(6, [1, 1, 1, 2, 4])); // 1

 

 

출처

 

자바스크립트 알고리즘 문제풀이(코딩테스트 대비) - 인프런 | 강의

자바스크립트(JavaScript)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 재미있게 풀 수 있는 기초 단계 문제부터 고급 알고리즘까지 단계별로 차근차근 배우도록 설계된 강좌입니다., - 강의

www.inflearn.com