카테고리 없음

코드업 4424 / 백준 2670 : 연속 부분 최대곱

JUNFUTURE 2022. 11. 3. 16:16

https://codeup.kr/problem.php?id=4424 

 

연속 부분 최대곱

문제1) N개의 양의 실수가 있을 때, 한 개 이상의 연속된 수들의 곱이 최대가 되는 부분을 찾아, 그 곱을 출력하는 프로그램을 작성하시오. 예를 들어 아래와 같이 8개의 양의 실수가 주어진다면,

codeup.kr

https://www.acmicpc.net/problem/2670

 

2670번: 연속부분최대곱

첫째 줄은 나열된 양의 실수들의 개수 N이 주어지고, 그 다음 줄부터 N개의 수가 한 줄에 하나씩 들어 있다. N은 10,000 이하의 자연수이다. 실수는 소수점 첫째자리까지 주어지며, 0.0보다 크거나

www.acmicpc.net

연속부분 최대합이 포인트다.

쭉 연속해서 곱하는게 원칙

곱하다가 지금 만나는 값이랑 비교해서 여태까지 만든 맥스보다크면

그걸 버리고 새로만난 아이부터 값을 곱해나가면 된다.

#include <stdio.h>

int main() {
	double arr[10000] = {0,};
	double dp_arr[10000];

	int N;

	scanf("%d", &N);

	for (int i = 0; i < N; i++) {
		scanf("%lf", &arr[i]);
	}

	// set initial value
	dp_arr[0] = arr[0];
	double max = dp_arr[0];

	// processing
	for (int i = 1; i <= N; i++) {
		// continue mul until now max < now value
		if (dp_arr[i - 1] > 1) {
			dp_arr[i] = arr[i] * dp_arr[i-1];
		}
		else {
			// dp_arr[i-1] < 1, do not multiply
			dp_arr[i] = arr[i] * 1;
		}
		max = (max > dp_arr[i]) ? max : dp_arr[i];
	}

	printf("%.3f", max);

	return 0;
}

사실 지금까지 곱해온 값 (dp_arr[i]) 와

바로 이전까지 곱해온 값 (dp_arr[i-1]) 기억하면 되어서

 

각각 now, before 변수로 바꾸어 코드를 작성해봤다.

#include <stdio.h>

int main() {
	double arr[10000] = {0,};
	double now, before;

	int N;

	scanf("%d", &N);

	for (int i = 0; i < N; i++) {
		scanf("%lf", &arr[i]);
	}

	// set initial value
	now = before = arr[0];
	double max = now;

	// processing
	for (int i = 1; i <= N; i++) {
		// continue mul until now max < now value
		if (before > 1) {
			now = arr[i] * before;
		}
		else {
			// dp_arr[i-1] < 1, do not multiply
			now = arr[i] * 1;
		}
		max = (max > now) ? max : now;
		before = now;
	}

	printf("%.3f", max);

	return 0;
}