백준 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..