인프런 커뮤니티 질문&답변

냠냠냠님의 프로필 이미지
냠냠냠

작성한 질문수

자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)

3. 연속부분수열1(Two Pointers Algorithm)

안녕하세요 선생님, 질문이 있습니다.

해결된 질문

작성

·

128

0

function solution(target, arr) {
  let [count, left, right, sum] = [0, 0, 0, arr[0]];

  while (left < arr.length) {
    if (sum < target) {
      if (right === arr.length - 1) break;
      sum += arr[++right];
    } else if (sum > target) {
      sum -= arr[left++];
    } else if (sum === target) {
      count++;
      if (right === arr.length - 1) break;
      sum = sum + arr[++right] - arr[left++];
    }
  }
  return count;
}

let a = [1, 2, 1, 3, 1, 1, 1, 2];
console.log(solution(6, a));

저는 위와 같이 코드를 짜보았는데요,

(문제에서 주어진 파라미터 m을 target이라고 바꿔서 썼습니다)

1. 문제에서 주어진 배열 원소의 범위가 '1~1000 사이의 자연수 ' 이기 때문에 target === sum 인 경우에 left와 right를 동시에 증가시켜줘도 된다고 판단했습니다. 이렇게 생각해도 될까요??

2. 선생님의 풀이에서 m=3, arr = [1, 1, 3, 1, 2] 인 경우에

lt가 rt를 넘어가는 부분이 생기는데 괜찮은 건가요??

lt === 2, rt === 2가 되고 나서 14번 라인에서 lt가 먼저 3이 되고 곧바로 다음 for문이 실행되면서 rt가 3이 됩니다.

답변 1

0

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

1. 네. 문제없는 코드입니다.

2. 네. 상관없습니다. lt와 rt를 크기 비교할 일이 없이 rt는 증가하면서 sum에 더하는 일을 하면 되고, lt는 증가하면서 sum에서 빼는 일을 하면 됩니다. sum이 음수로 갈 일을 없으니 상관없습니다.

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

while(sum>m){
    sum-=arr[lt++];
    if(sum===m) answer++;       
}
냠냠냠님의 프로필 이미지
냠냠냠

작성한 질문수

질문하기