안녕지구 #developer #bompapa

BOJ - 수들의 합2(2003)

|

포인터 두 개를 사용해서 해결할 수 있는 알고리즘입니다. 간단해 보이지만 끝나는 조건을 잘못 설정하면 무한으로 loop 가 될 가능성이 있어서 조심해야 합니다.

front 가 마지막 위치에 도착하면, rear가 front 쪽으로 이동하면서 마지막으로 M과 같아지면 front가 앞으로 한 번 더 이동하고 while문 조건에 의해서 끝나게 됩니다.

풀이 코드

#include <stdio.h>

int A[10001];
int main() {
	int N, M;
	scanf("%d %d", &N, &M);
	A[0] = 0;
	for (int i = 1; i <= N; i++) {
		scanf("%d",&A[i]);
	}
	
	int front, rear, sum, ans;
	front = sum = ans = 0;
	rear = 0;

	while(front <= N && rear <= N) {
		
		if (sum == M) {
			ans++;
			sum += A[++front];
			sum -= A[rear++];
			continue;
		} 
		if (sum < M) {
			sum += A[++front];
			continue;
		}
		if (sum > M) {
			sum -= A[rear++];
			continue;
		}
	}

	printf("%d", ans);

	return 0;
}

Comments