-
[C++] ํฌ ํฌ์ธํฐ(Two Pointers) ์๊ณ ๋ฆฌ์ฆAlgorithm & Data Structure 2022. 2. 5. 15:49๋ฐ์ํ
๋ค์ด๊ฐ๋ฉฐ
๋ฐฑ์ค 3273๋ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ ๋ฐ 2์ค for๋ฌธ์ผ๋ก ์ฝ๋๋ฅผ ์ง์ ์ ์ถํ๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋์ ์ด์ ๋ํ ํด๊ฒฐ๋ฐฉ์์ ์์๋ณด๊ฒ ๋์๋ค. ํฌ ํฌ์ธํฐ(Two Pointers)๋ก ํด๊ฒฐํ๋ฉด ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์ด์ ๋ํด ์ค๋ช ํ๋ค.
ํฌ ํฌ์ธํฐ๋?
ํฌ ํฌ์ธํฐ(Two Pointers)๋ 1์ฐจ์ ๋ฐฐ์ด์์ ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์กฐ์ํ์ฌ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ์๊ณ ๋ฆฌ์ฆ์ ๋งํ๋ค. ์ด์ฒ๋ผ ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ๋ณต๋ฌธ์ ์ฌ๋ฌ๋ฒ ์ํํ๋ ๊ฒ ๋ณด๋ค ์๊ฐ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
์ต์ ์ ๊ฒฝ์ฐ์๋ ๋ ๊ฐ์ ํฌ์ธํฐ๊ฐ ๋ฐฐ์ด์ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ก ์ค๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์๊ฐ ๋ณต์ก๋๋ O(n)์ด๋ค.ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ
๋ฐฑ์ค 2003๋ฒ ๋ฌธ์ ๋ฅผ ์์๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ดํดํด๋ณด์.
์ด ๋ฌธ์ ์์๋ N๊น์ง์ ๋ฐฐ์ด์ด ์๊ณ ๋ถ๋ถํฉ์ด M์ด ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ค. ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ด๋ฅผ ํ์ดํ ๊ฒฝ์ฐ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋๊ฒ ๋๋ค. ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ ์ด๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
๋จผ์ ๋ถ๋ถ ๋ฐฐ์ด์ ์์ ๊ฐ๋ฆฌํค๋ start์ ๋ถ๋ถ๋ฐฐ์ด์ ๋ค๋ฅผ ๊ฐ๋ฆฌํค๋ end๋ฅผ ์ ์ธํ์ฌ ๋ ๊ฐ์ ํฌ์ธํฐ๋ก ์ฌ์ฉํ๋ค. ์ฆ, ๋ ํฌ์ธํฐ๋ ์ฒซ ๋ฒ์งธ ์์์ ์ธ๋ฑ์ค(0)๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ๋ถํฐ ์์ํ๋ค.
์๋๋ ์ด ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ ๊ฒ์ด๋ค.
- ์์์ (start)๊ณผ ๋์ (end)์ด ์ฒซ ๋ฒ์งธ ์์์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ๋ค.
- ๋ถ๋ถํฉ๊ณผ M์ ๋น๊ตํ์ฌ ์๋์ ๊ฐ์ด ์ฒ๋ฆฌํ๋ค.
- ๋ถ๋ถํฉ๊ณผ M์ด ๊ฐ๋ค๋ฉด count๋ฅผ 1๋งํผ ์ฆ๊ฐ์ํจ๋ค.
- ๋ถ๋ถํฉ์ด M๋ณด๋ค ์๋ค๋ฉด end๋ฅผ 1๋งํผ ์ฆ๊ฐ์ํจ๋ค.
- ๋ถ๋ถํฉ์ด M๋ณด๋ค ํฌ๋ค๋ฉด start๋ฅผ 1๋งํผ ์ฆ๊ฐ์ํจ๋ค.
- ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ธํ ๋๊น์ง 2๋ฒ์ ๋ฐ๋ณตํ๋ค.
#include <bits/stdc++.h> using namespace std; int main(void) { ios::sync_with_stdio(0); cin.tie(0); int N, M; cin >> N >> M; int arr[10002]; for (int i = 0; i < N; i++) { cin >> arr[i]; } int count = 0; int start = 0; int end = 0; int sum = 0; while (end <= N) { if (sum < M) { sum += arr[end++]; } else if (sum > M) { sum -= arr[start++]; } else { count++; sum += arr[end++]; } } cout << count; return 0; }
๋ฐ์ํ