https://www.acmicpc.net/problem/2670
문제
N개의 실수가 있을 때, 한 개 이상의 연속된 수들의 곱이 최대가 되는 부분을 찾아, 그 곱을 출력하는 프로그램을 작성하시오. 예를 들어 아래와 같이 8개의 양의 실수가 주어진다면,
색칠된 부분의 곱이 최대가 되며, 그 값은 1.638이다.
입력
첫째 줄은 나열된 양의 실수들의 개수 N이 주어지고, 그 다음 줄부터 N개의 수가 한 줄에 하나씩 들어 있다. N은 10,000 이하의 자연수이다. 실수는 소수점 첫째자리까지 주어지며, 0.0보다 크거나 같고, 9.9보다 작거나 같다.
출력
계산된 최댓값을 소수점 이하 넷째 자리에서 반올림하여 소수점 이하 셋째 자리까지 출력한다.
예제 입력 1 복사
8
1.1
0.7
1.3
0.9
1.4
0.8
0.7
1.4
예제 출력 1 복사
1.638
문제풀이(1)
첫 번째 값을 temp에 추가한뒤 이후 나오는 연속된 값을 곱한 값과 현재의 값을 비교하여 계산한다.
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = require("fs").readFileSync(filePath).toString().trim().split("\n").map(Number);
const N = input.shift();
let temp = input[0];
let answer = 0;
for (let i = 1; i < N; i++) {
// 현재 숫자가 이전값 * 현재 숫자보다 클 경우 이전값을 현재 값으로 변경한다.
if (input[i] > temp * input[i]) {
temp = input[i];
} else {
temp *= input[i];
}
answer = Math.max(temp, answer);
}
console.log(answer.toFixed(3));
문제풀이(2) - 리팩토링
temp 대신 currentProduct를 사용하여 현재까지의 곱을 나타내고, answer 대신 maxProduct를 사용하여 최대 곱을 나타냄
또한, 각 숫자에 대해 수행하는 작업을 한 줄로 줄임.
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = require("fs").readFileSync(filePath).toString().trim().split("\n").map(Number);
const N = input.shift();
let maxProduct = input[0];
let currentProduct = maxProduct;
for (let i = 1; i < N; i++) {
const currentNumber = input[i];
currentProduct = currentNumber > currentProduct * currentNumber ? currentNumber : currentProduct * currentNumber;
maxProduct = Math.max(currentProduct, maxProduct);
}
console.log(maxProduct.toFixed(3));
'Algorithm' 카테고리의 다른 글
[Baekjoon]10157번 자리배정 - Javascript (2) | 2024.01.04 |
---|---|
[Baekjoon]5568번 카드 놓기 - Javascript (1) | 2024.01.03 |
[Baekjoon]9507번 Generations of Tribbles - Javascript (0) | 2024.01.02 |
[Baekjoon]25192번 인사성 밝은 곰곰이 - Javascript (0) | 2024.01.02 |
[Baekjoon]4134번 다음 소수 - Javascript (1) | 2024.01.01 |