https://www.acmicpc.net/problem/2003
2003번: 수들의 합 2
첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.
www.acmicpc.net
투포인터의 기초로 여겨지는 문제로 개념을 알아둘 겸 문제풀이를 진행했다.
투포인터에 대한 개념은 아래 블로그에 내가 이해한 방식과 비슷하게 써져 있어 링크를 걸어두겠다.
https://ssungkang.tistory.com/entry/Algorithm-Two-Pointers-%ED%88%AC-%ED%8F%AC%EC%9D%B8%ED%84%B0
[Algorithm] Two Pointers, 투 포인터
이번 포스팅에서는 Two Pointers 에 대해서 알아보도록 하겠습니다. Two Pointers 는 1차원 배열에서 두 개의 포인터를 조작하여 원하는 결과를 얻는 알고리즘입니다. 여기서 두 개의 포인터를 사용하
ssungkang.tistory.com
#include <iostream>
using namespace std;
int N, M; //M : arr[start]~[end-1]까지의 합
int arr[10001];
int main() {
int start = 0, end = 0;
int count = 0, sum = 0;
cin >> N >> M;
for (int i = 0; i < N; i++) cin >> arr[i];
// start 포인터가 arr[N-1] 인덱스까지 탐색하도록 반복문 수행
while (start < N) {
//구간합이 M보다 작고 end포인터가 마지막인덱스를 넘지 않는 경우
if (sum < M && end < N) {
// end포인터 증가 및 sum값 변경
sum += arr[end];
end++;
}
else {
// 구간합과 M이 같다면 count 증가
if (sum == M) count++;
//start포인터 증가 및 sum값 변경
sum -= arr[start];
start++;
}
}
cout << count << endl;
return 0;
}
처음에는 sum을 arr[start]부터 arr[end]까지의 합으로 두고 풀었는데 그럴 경우 sum의 초기값을 arr[0]으로 초기화해야 해서 좀 더 알고리즘에 맞게 sum을 arr[start]부터 arr[end-1]까지의 합으로 바꿔 풀었다.
'CodingTest Practice > BOJ (Baekjoon Online Judge)' 카테고리의 다른 글
백준 7562 : 나이트의 이동 (C++, BFS) (0) | 2021.12.22 |
---|---|
백준 1920 : 수 찾기 (C++, 이분탐색) (0) | 2021.12.11 |
백준 10026 : 적록색약 (C++ , BFS) (0) | 2021.12.08 |
백준 1012 : 유기농 배추 (C++, BFS) (2) | 2021.12.07 |
백준 1926번: 그림 C++코드 (0) | 2021.08.15 |