๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with Python]_39_ํฌ ํฌ์ธํฐ ๋ณธ๋ฌธ
[์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค with Python]_39_ํฌ ํฌ์ธํฐ
์ง์ง์ํ์นด 2022. 2. 16. 00:23220216 ์์ฑ
<๋ณธ ๋ธ๋ก๊ทธ๋ ใ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋คใ ์ youtube๋ฅผ ์ฐธ๊ณ ํด์ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์์ต๋๋ค>
https://www.youtube.com/watch?v=ttLRltNDiCo&list=PLVsNizTWUw7H9_of5YCB0FmsSc-K44y81&index=39
1. ํฌ ํฌ์ธํฐ (Two Pointers)
: ๋ฆฌ์คํธ์ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํด์ผ ํ ๋ ๋ ๊ฐ์ ์ ์ ์์น๋ฅผ ๊ธฐ๋กํ๋ฉด์ ์ฒ๋ฆฌํ๋ ์๊ณ ๋ฆฌ์ฆ
: ๋ฆฌ์คํธ์ ๋ด๊ธด ๋ฐ์ดํฐ์ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํด์ผ ํ ๋๋ ์์๊ณผ ๋์ 2๊ฐ์ ์ ์ผ๋ก ์ ๊ทผํ ๋ฐ์ดํฐ์ ๋ฒ์ ํํํ๋ค
EX) ํน์ ํ ํฉ์ ๊ฐ์ง๋ ๋ถ๋ถ ์ฐ์ ์์ด ์ฐพ๊ธฐ
- N๊ฐ์ ์์ฐ์๋ก ๊ตฌ์ฑ๋ ์์ด
- ํฉ์ด M์ธ ๋ถ๋ถ ์ฐ์ ์์ด์ ๊ฐ์
- ์ํ ์๊ฐ O(N)
1) ์์์ (strat)๊ณผ ๋์ (end)์ด ์ฒซ ๋ฒ์งธ ์์์ ์ธ๋ฑ์ค ๊ฐ๋ฆฌํค๊ธฐ
2) ํ์ฌ ๋ถ๋ถ ํฉ์ด M ๊ณผ ๊ฐ๋ค๋ฉด ์นด์ดํธ
3) ํ์ฌ ๋ถ๋ถ ํฉ์ด M๋ณด๋ค ์๋ค๋ฉด, end 1 ์ฆ๊ฐ
4) ํ์ฌ ๋ถ๋ถ ํฉ์ด M๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๋ฉด, start 1 ์ฆ๊ฐ
5) ๋ชจ๋ ๊ฒฝ์ฐ ํ์ธํ ๋๊น์ง 2~4 ๊ณผ์ ๋ฐ๋ณต
- python
n = 5 # ๋ฐ์ดํฐ์ ๊ฐ์ N
m = 5 # ์ฐพ๊ณ ์ ํ๋ ๋ถ๋ถํฉ M
data = [1, 2, 3, 2, 5] # ์ ์ฒด ์์ด
count = 0
interval_sum = 0
end = 0
# start๋ฅผ ์ฐจ๋ก๋๋ก ์ฆ๊ฐ์ํค๋ฉฐ ๋ฐ๋ณต
for start in range(n):
# end๋ฅผ ๊ฐ๋ฅํ ๋งํผ ์ด๋์ํค๊ธฐ
while interval_sum < m and end < n:
interval_sum += data[end]
end += 1
# ๋ถ๋ถํฉ์ด m์ผ ๋ ์นด์ดํธ ์ฆ๊ฐ
if interval_sum == m:
count += 1
interval_sum -= data[start]
print(count)
- c++
#include <bits/stdc++.h>
using namespace std;
int n = 5; // ๋ฐ์ดํฐ์ ๊ฐ์ N
int m = 5; // ์ฐพ๊ณ ์ ํ๋ ๋ถ๋ถํฉ M
int arr[] = {1, 2, 3, 2, 5}; // ์ ์ฒด ์์ด
int main() {
int cnt = 0;
int intervalSum = 0;
int end = 0;
// start๋ฅผ ์ฐจ๋ก๋๋ก ์ฆ๊ฐ์ํค๋ฉฐ ๋ฐ๋ณต
for (int start = 0; start < n; start++) {
// end๋ฅผ ๊ฐ๋ฅํ ๋งํผ ์ด๋์ํค๊ธฐ
while (intervalSum < m && end < n) {
intervalSum += arr[end];
end += 1;
}
// ๋ถ๋ถํฉ์ด m์ผ ๋ ์นด์ดํธ ์ฆ๊ฐ
if (intervalSum == m) {
cnt += 1;
}
intervalSum -= arr[start];
}
cout << cnt << '\n';
}
- java
import java.util.*;
class Main {
public static int n = 5; // ๋ฐ์ดํฐ์ ๊ฐ์ N
public static int m = 5; // ์ฐพ๊ณ ์ ํ๋ ๋ถ๋ถํฉ M
public static int[] arr = {1, 2, 3, 2, 5}; // ์ ์ฒด ์์ด
public static void main(String[] args) {
int cnt = 0;
int intervalSum = 0;
int end = 0;
// start๋ฅผ ์ฐจ๋ก๋๋ก ์ฆ๊ฐ์ํค๋ฉฐ ๋ฐ๋ณต
for (int start = 0; start < n; start++) {
// end๋ฅผ ๊ฐ๋ฅํ ๋งํผ ์ด๋์ํค๊ธฐ
while (intervalSum < m && end < n) {
intervalSum += arr[end];
end += 1;
}
// ๋ถ๋ถํฉ์ด m์ผ ๋ ์นด์ดํธ ์ฆ๊ฐ
if (intervalSum == m) {
cnt += 1;
}
intervalSum -= arr[start];
}
System.out.println(cnt);
}
}