(알고리즘) 투포인터 + 슬라이딩 윈도우
코딩 테스트 심심치 않게 나오는
투 포인터 알고리즘
과슬라이딩 윈도우
에 대한 개념과 원리를 파악하고자 포스팅했습니다. 🧑🏻💻
투 포인터 알고리즘이란?🧐
투 포인터 알고리즘
이란 이름 그대로 두 가지 포인터를 사용하여 문자열이나 배열에서 원하는 값을 찾는 방식이다. 대표적인 문제로는 연속 부분 수열
문제가 있다.
투 포인터 알고리즘 사용이유 💡
투 포인터 알고리즘 없이 무작정 탐색(반복문)을 사용하면 보통 이중 포문을 사용하면서 문제를 풀게 되는데 시간 복잡도 O(n2)
이 넘어가며 너무 많은 시간이 걸리는 경우가 많다. 투 포인터 알고리즘은 반복문이 한번 돌기 때문에 시간 복잡도O(n)
으로 더 효율적이다.
말로는 어떠한 방법인지 알기 힘들므로 밑에서 유명한 연습문제를 보며 설명해 보겠습니다.😁
투 포인터 알고리즘 예제 📝
N 개의 수로 이루어진 수열이 주어집니다. 이 수열에서 연속 부분 수열의 합이 특정 숫자 M이 되는 경우가 몇 번 있는지 구하는 프로그램을 작성하세요. 만약 N=8, M=6이고 수열이 다음과 같다면 12131112 합이 6이 되는 연속 부분 수열은 {2, 1, 3}, {1, 3, 1, 1},{3, 1, 1, 1}로 총 3가지입니다.
입력설명 🕵🏻♂️
첫째 줄에 N(1≤N≤100,000), M(1≤M≤100,000,000)이 주어진다. 수열의 원소값은 1,000을 넘지 않는 자연수이다.
입력예제 ✒️
10 5 1 2 3 4 2 5 3 1 1 2
해결방식 🗝
- 두 개의 포인터
lt, rt
를 각각 0으로 세팅한다. - 연속 부분 수열의 합을 저장할
sum
을 0으로 선언한다. rt
위치가 증가하면서sum
에rt
위치의 값을 더한다.- 만약
sum
값이 원하는 합보다 클 경우에lt
위치의 값을 빼주면서lt
를 증가시킨다. - 만약
sum
값과 원하는 합의 값이 같다면answer
를 1증가 시킨다.
동작방식 🐎
이런 식으로 5
보다 작다면 rt
를 증가시키고 크다면 lt
를 증가시키면서 값을 구하다 보면 5
일 때의 값이 나오게 된다. 그럴 때마다 answer
의 값을 증가시켜주면서 반복문을 끝까지 돌면 된다.
투 포인터 알고리즘
과 비슷한슬라이딩 윈도우(sliding window)
라는 알고리즘도 존재합니다.투 포인터
와 어떤 차이점이 있는지 밑에서 확인해 보겠습니다.
슬라이딩 윈도우(sliding window)란?🤔
마치 창문을 한쪽으로 밀면서 문제를 푸는 것과 모양이 유사해서 붙여진 이름이다. 투 포인터처럼 구간을 훑으면서 지나간다는 공통점은 있으나 어느 순간에도 그 구간의 넓이가 동일하다는 차이점이 있다. 구간의 넓이가 주어졌을 때는 슬라이딩 윈도우로 문제를 풀면 되겠다.
슬라이딩 윈도우(sliding window) 예제 📝
현수의 아빠는 제과점을 운영합니다. 현수 아빠는 현수에게 N일 동안의 매출기록을 주고 연속 된 K일 동안의 최대 매출액이 얼마인지 구하라고 했습니다. 만약 N=10이고 10일 간의 매출기록이 아래와 같습니다. 이때 K=3이면 12 15 11 20 25 10 20 19 13 15 연속된 3일간의 최대 매출액은 11+20+25=56만원입니다. 여러분이 현수를 도와주세요.
입력설명 🕵🏻♂️
첫 줄에 N(5<=N<=100,000)과 M(2<=K<=N)가 주어진다. 두 번째 줄에 N개의 숫자열이 주어진다. 각 숫자는 500이하의 음이 아닌 정수이다.
입력예제 ✒️
7 3 -3 3 1 -3 2 4 7
최대매출 해결방식 🗝
- 매출의 합을 저장할
res
을 선언하고 첫 번째 인덱스 값부터 k까지의 값의 합을res
에 저장한다. - K부터 N의 길이까지 증가시키면서 k의 인덱스 값을 더하고 k-k의 값을 빼준다.
- 반복문이 한번 돌 때마다
answer
값과 현재의res
값을 비교하면서 더 큰값을answer
에 추가한다.
최대매출 동작방식 🐎
위에서 말한 해결 방식
처럼 처음 시작은 k 길이만큼 -3,3,1을 res
에 더해준다. 그런다음 다음으로 넘어갈때는 문이 미끄러지는 거와 같이 오른쪽으로 문이 1칸 가게된다. 그때의 res
값은 -3을 더해주고 뒤에 값 -3을 빼준다. 이런식으로 쭉 진행한다면 반복문이 한번 다 돌면 값이 나오므로 시간 복잡도는 O(n)
이 된다.
궁금하신 점이 있다면 아래 댓글
로 남겨주세요!👇