ํฌ ํฌ์ธํฐ(Two pointer)์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ(Sliding Window)
๐น ํฌ ํฌ์ธํฐ (Two pointer)
- 1์ฐจ์ ๋ฐฐ์ด์์ ๊ฐ๊ฐ ๋ค๋ฅธ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ 2๊ฐ์ ํฌ์ธํฐ๋ฅผ ์กฐ์ํด ๊ฐ๋ฉฐ ์ํ๋ ๊ฐ์ ์ฐพ์ ๋๊น์ง ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ์ด๋ฌํ ํน์ฑ ๋๋ฌธ์, ์ฐ์๋๊ณ ๊ธธ์ด๊ฐ ๊ฐ๋ณ์ ์ธ ๋ถ๋ถ ๋ฐฐ์ด๋ค์ ํ์ฉํ์ฌ ํน์ ์กฐ๊ฑด์ ์ผ์น์ํค๋ ๋ฌธ์ ์ ์ ์ฉ ๊ฐ๋ฅํ๋ค.
- ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ 2๊ฐ์ง ์ ํ์ด ์กด์ฌํ๋ค.
- 2๊ฐ์ ํฌ์ธํฐ ๋ณ์ ์์์ ์ด ๋ฐฐ์ด์ ์์์ ์ธ ๊ฒฝ์ฐ
- ์ ๋ ฌ๋ ๋ฐฐ์ด ์์์ 2๊ฐ์ ํฌ์ธํฐ ๋ณ์๊ฐ ๊ฐ๊ฐ ์์์ ๊ณผ ๋์ ์ ์์นํ ๊ฒฝ์ฐ
์์ ์ ํ ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ 2๊ฐ์ง ์ ํ์ ๊ฐ๊ฐ ๋ฌธ์ ๋ฅผ ํตํด ์์๋ณด์.
๐ธ 2๊ฐ์ ํฌ์ธํฐ ๋ณ์ ์์์ ์ด ๋ฐฐ์ด์ ์์์ ์ธ ๊ฒฝ์ฐ
์๋ฅผ ๋ค์ด, ๋ฐฑ์ค 2003 ์๋ค์ ํฉ 2 ๋ฌธ์ ์์๋ N๊ฐ์ ์์ด์์ ํน์ ๊ตฌ๊ฐ(i๋ถํฐ j)์ ํฉ์ด M์ด ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์๊ณ ์ถ๋ค.
๋จผ์ , ๋ ํฌ์ธํฐ start์ end๋ ์์์ 0์์ ๊ฐ์ด ํ์์ ์์ํ๋ค.
end ํฌ์ธํฐ๋ฅผ ํ ์นธ์ฉ ์์ง์ฌ start์ end ์ฌ์ด์ ์๋ ์์๋ค์ ๊ตฌ๊ฐํฉ(sum)์ ๊ตฌํด์ค๋ค.
sum์ ๊ฐ์ด M๋ณด๋ค ํฐ ๊ฒฝ์ฐ, sum์์ ํ์ฌ start ์์น ๊ฐ์ ๋นผ์ฃผ๊ณ start ํฌ์ธํฐ๋ฅผ ํ ์นธ ์์ผ๋ก ์ด๋ํ๋ค.
sum๊ณผ M์ด ๊ฐ์ ๊ฐ์ผ ๋ cnt๋ฅผ ์ฆ๊ฐ์์ผ ์ค๋ค.
end ํฌ์ธํฐ๊ฐ N์ ๋๋ฌํ๋ฉด while๋ฌธ์ ๋น ์ ธ๋์จ๋ค.
๐ญ Java Code
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 2, 5, 3, 1, 1, 2};
int n = 10, m = 5;
int start = 0, end = 0;
int sum = 0, cnt = 0;
while (true) {
if (sum >= m) {
sum -= arr[start++];
} else if (end == n) break;
else {
sum += arr[end++];
}
if (sum == m) cnt++;
}
System.out.println(cnt);
}
}
๐ธ 2๊ฐ์ ํฌ์ธํฐ ๋ณ์๊ฐ ๊ฐ๊ฐ ์์์ ๊ณผ ๋์ ์ ์์นํ ๊ฒฝ์ฐ
์๋ฅผ ๋ค์ด, ๋ฐฑ์ค 2470 ๋ ์ฉ์ก ๋ฌธ์ ์์๋ ์์ ์ ์๋ก ๋ํ๋ด์ง ์ฐ์ฑ ์ฉ์ก๊ณผ ์์ ์ ์๋ก ๋ํ๋ด์ง ์์นผ๋ฆฌ์ฑ ์ฉ์ก์ ํผํฉํ์ฌ ํน์ฑ ๊ฐ์ด 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ ๋ง๋ค์ด๋ด๋ ๋ ์ฉ์ก์ ์๊ณ ์ถ๋ค.
์ฃผ์ด์ง ๋ฐฐ์ด์์ 0์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ฉ์ก์ ๋ง๋ค์ด์ผ ํ๊ธฐ ๋๋ฌธ์, ๋จผ์ ๋ฐฐ์ด์ ์ ๋ ฌํด ์ค๋ค.
์์ชฝ ๋์ start ํฌ์ธํฐ์ end ํฌ์ธํฐ๋ฅผ ๋๊ณ ์๋ก ์ค์์ ํฅํด ๊ฑฐ๋ฆฌ๋ฅผ ์ขํ์ง๋ ํํ๋ก ํ์ํ๋ฉฐ ์ฉ์ก์ ๊ณจ๋ผ์ฃผ๋ฉด ๋๋ค.
arr[start] + arr[end] = -92 < 0 ์ด๋ฏ๋ก ๊ฐ์ด ๋ ์ปค์ ธ์ผ ํ๋ค.
๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ผ๋ฏ๋ก ๋ ์์ ํฉ์ด ์ปค์ง๊ธฐ ์ํด์๋ start ํฌ์ธํฐ๋ฅผ ํ ์นธ ์ด๋ํด์ค์ผ ํ๋ค.
arr[start] + arr[end] = 5 > 0 ์ด๋ฏ๋ก ๊ฐ์ด ๋ ์์์ ธ์ผ ํ๋ค.
๋ ์์ ํฉ์ด ์์์ง๊ธฐ ์ํด์๋ end ํฌ์ธํฐ๋ฅผ ํ ์นธ ์ด๋ํด์ค์ผ ํ๋ค.
์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ์์ ์งํํ๋ค start < end๊ฐ ๋๋ ์์ ์์ ํ์์ ์ข ๋ฃํด ์ฃผ๋ฉด ๋๋ค.
๐ญ Java Code
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = {-99, 4, 7, -1, -2};
int n = 5;
Arrays.sort(arr);
int start = 0, end = n-1;
int min = Integer.MAX_VALUE;
int[] ans = new int[2];
while (start < end) {
int sum = arr[start] + arr[end];
if (min > Math.abs(sum)) {
min = Math.abs(sum);
ans[0] = arr[start];
ans[1] = arr[end];
if (sum == 0) break;
}
if (sum < 0) start++;
else end--;
}
System.out.println(ans[0] + " " + ans[1]);
// ์ถ๋ ฅ : -2 4
}
}
๐น ์ฌ๋ผ์ด๋ฉ ์๋์ฐ (Sliding Window)
- ํฌ ํฌ์ธํฐ์ ์ ์ฌํ์ง๋ง, ๋ถ๋ถ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๊ณ ์ ํด์ ํ์ํ๋ ๋ฐฉ์์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ๊ฐ์ ๊ธธ์ด๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ก๊ธฐ ๋๋ฌธ์ ๊ตฌ๊ฐ์ ์์ชฝ ๋์ด ๋๋ ํฌ์ธํฐ 2๊ฐ๊ฐ ํ์ํ๋ค.
- ๋ฐ๋ฉด, ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ๊ฐ์ ๊ธธ์ด๋ฅผ ๊ณ ์ ์ ์ผ๋ก ์ก๊ธฐ ๋๋ฌธ์ ํฌ์ธํฐ๊ฐ ํ๋๋ง ์์ด๋ ๋ฐฐ์ด์ ๋์ด ์ด๋์ง ์ ์ ์๋ค.
์ด์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌธ์ ๋ฅผ ํตํด ์์๋ณด์.
์๋ฅผ ๋ค์ด, ๋ฐฑ์ค 2559 ์์ด ๋ฌธ์ ์์๋ ์์ด์์ ์ฐ์์ ์ธ k์ผ์ ์จ๋์ ํฉ์ด ์ต๋๊ฐ ๋๋ ๊ฐ์ ์๊ณ ์ถ๋ค.
k ํฌ๊ธฐ์ ์๋์ฐ๋ฅผ ๋ฐฐ์ด์ ์ฒ์๋ถํฐ ๋๊น์ง ํ์ํ์ฌ ์๋์ฐ ๋ด์ ์์ ํฉ์ ๊ตฌํ๋ค๊ณ ์๊ฐํด ๋ณด์.
๋จผ์ 0๋ฒ ์ธ๋ฑ์ค๋ถํฐ k-1๋ฒ์งธ ์ธ๋ฑ์ค๊น์ง ๋ํด sum์ ๊ตฌํด์ค ํ ์ต๋๊ฐ์ผ๋ก ์ค์ ํด ์ค๋ค.
์๋์ฐ๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์์ง์ด๋ฉด,
์๋ก ์๋์ฐ์ ํฌํจ๋ ์ค๋ฅธ์ชฝ ๊ฐ์ ๋ํ๊ณ ์๋์ฐ์์ ๋น ์ง๊ฒ ๋ ์ผ์ชฝ ๊ฐ์ ๋นผ์ฃผ๋ฉด ๊ทธ๋ค์ ์์น์ ํฉ์ ๊ตฌํ ์ ์๋ค.
๋ ๊ฐ์ ํฉ์ ๋น๊ตํ์ฌ ์ต๋๊ฐ์ ๊ฐฑ์ ํด ์ฃผ๊ณ , ์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฐฐ์ด ๋๊น์ง ๋ฐ๋ณตํ์ฌ ํ์ํ๋ค.
๐ญ Java Code
public class Main {
public static void main(String[] args) {
int n = 10;
int k = 2;
int[] arr = {3, -2, -4, -9, 0, 3, 7, 13, 8, -3};
int sum = 0;
for (int i = 0; i < k; i++) {
sum += arr[i];
}
int ans = sum;
for (int i = k; i < n; i++) {
sum += (arr[i] - arr[i-k]);
ans = Math.max(ans, sum);
}
System.out.println(ans);
}
}
๐ reference