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