1806 부분합
본문 바로가기
알고리즘 모음집/New 알고리즘

1806 부분합

by KyeongMin 2021. 3. 1.
728x90
반응형

www.acmicpc.net/problem/1806

 

1806번: 부분합

첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.

www.acmicpc.net

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define NS 100005//배열 최대크기
int N;//입력되는 배열 크기
long long int S;//찾아야하는 값
int arr[NS];//입력되는 숫자 저장하는 배열
void init() {// 초기화 및 초기 입력 함수
	N = S = 0;
	memset(arr, 0, sizeof(arr));

	scanf("%d %ld", &N, &S);
	for (int i = 0; i < N; i++) {
		scanf("%d", &arr[i]);
	}
}
long long int twoPoint() {//투포인터 이용 연속되는 합 구하기
	int L, R;//인덱스
	L = R = 0;
	int sum = 0;//합 산출
	long long int min = 0x7fffffff;//결과 값 

	while (L <= R && R <= N) {
		//cout << "L : " << L << "R : " << R << "sum : " << sum << '\n';
		if (sum < S) {//현재 값이 목표 값보다 작으면  R인덱스 증가

			sum += arr[R++];
		}
		else if (sum >= S) {// 값이 크면 L인덱스 증가하고 sum 값 뺴기
			int len = R - L;
			min = min > len ? len : min;
			sum -= arr[L++];
		}

	}
	if (min == 0x7fffffff)min = 0;
	return min;
}
int main(void) {
	init();
	printf("%ld", twoPoint());
	return 0;
}

이문제의 경우에도 이전의 소수의 연속합과 비슷한 기법이 쓰입니다. 

투포인터 진짜 빠르게 탐색시 사용되니 알아두세요.

 

그리고 이거 풀때 진짜 실수 했던것이. 값이 안나오면 min 값이 0x7ffffff 이되는데 

그경우를 안걸러줘서 틀렸었네요. 

이런 실수 하지마세요. 

 

728x90
반응형

'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글

2632 피자 판매  (0) 2021.03.03
1205 부분수열의 합 2  (0) 2021.03.02
부분합을 구하는 방법  (0) 2021.03.01
2143 두 배열의 합  (0) 2021.03.01
7453 합이 0인 네 정수  (0) 2021.02.28

댓글