해결된 질문
작성
·
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가 따라가는 것처럼 코드를 짜려면 아래처럼 하는게 더 이해하기 좋은 코드 같네요.