알고리즘 +10

윤건호·2022년 10월 3일
0

알고리즘

목록 보기
10/23

슬라이딩 윈도우

배열을 밀고 가면서 연속된 배열 3개의 합이 가장 큰 숫자들의 합을 구하여라.

보통 이런 문제가 나올때 사용하는 알고리즘이라고 한다.

나도 오늘 처음 겪어봤지만 나름 알아봤기 때문에 쉬운 용어들로 정리할것이다.

배열에서 첫 연속된 3개의 합을 sum에 할당하고 다음 인덱스를 더하고,
이전 인덱스를 빼줌으로써 하나씩 밀고 간다는 느낌을 주기 때문에 ,
슬라이딩 윈도우 라고 부르는 것 같다.

이게 그래서 어떻게 동작하는건지? 를 코드로 보면 바로 이해못하겠지만 여러번 보면

이해된다.

for (let i = 0; i < k; i++) {
sum += arr[i];
}

K = 3이고, 거기까지의 합을 sum에 넣어두었다.

참고로 for문이 2개라고 해서 시간복잡도가 O(N^2) 이 아니고

중첩이 아니라 각각 쓰기때문에 O(N) 의 시간복잡도를 가진다.

그런 면에서라도 이 알고리즘은 아주 효율적인거 같다.

for (let i = k; i < arr.length; i++) {
sum += arr[i] - arr[i - k];
answer = Math.max(answer, sum);
}

i = k(3) 부터 시작해서 arr.length까지 점차 증가하며 포문을 돈다.

sum += arr[i = 3] - arr[3-3] 하면
sum += arr[3] - arr[0]

3번째 인덱스는 기존 구한 배열의 다음 인덱스이고 그 수를 더하고,
arr[0] 번째 값을 빼주는 방식으로
점차 전진하는 느낌인거다.

지금 설명이 이게 최선이다. 이해 못했다면 내 탓이다.

answer = Math.max(answer, sum);

점차 전진하면서 가장 큰 수를 answer에 계속해서 할당해주는 것이다.

진짜 코드도 짧고 이해하고 나면 너무 쉬워서 허무했지만,

다시 쓰라고 하면 자신 없으니 몇번 더 볼 필요가 있다.

앞으로 자주 쓸 것 같다.

profile
더 배우고 싶은 프론트엔드 개발자 윤건호입니다.

0개의 댓글