백준 2670 - 연속부분최대곱

Updated:

C++

2670 번 - 연속부분최대곱

문제

N개의 양의 실수가 있을 때, 한 개 이상의 연속된 수들의 곱이 최대가 되는 부분을 찾아, 그 곱을 출력하는 프로그램을 작성하시오. 문제 출처

접근 방법

연속된 모든 부분순열의 곱을 구하고 그 값 중 최대값을 구합니다. 처음 배열의 0 ~ (n -1)값을 기준으로 연속된 값을 하나씩 곱하며 그 중 최대값을 출력합니다.

위의 이미지를 기준으로 주황색으로 칠해진 부분이 1.3 0.9 1.4 이며, 이 세 값을 곱한 것이 최대값이다.

구현

코드

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n;
double* arr;
double* saved;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	
	cin >> n;
	arr = new double[n];            //곱해질 수
	saved = new double[n];          //초기 값

	for (int i = 0; i < n; i++) {
		cin >> arr[i];
		saved[i] = arr[i];
	}
	
	double maxNum = 0, multi = 1;

	for (int i = 1; i < n; i++) {
		for (int j = 0; j < n - i; j++) {
			arr[j] *= saved[j + i];
			maxNum = max(arr[j], maxNum);
		}
	}

	cout << fixed;				// 소수점만 고정시킴. 이것이 없으면 전체 자리 수 중 n자리만 고정시킴
	cout.precision(3);			// 3자리 고정

	cout << maxNum;
}

후기 및 개선할 점

소수 자리 고정하는데 은근히 신경쓰였다. fixed..