흙금이네 블로그

[BOJ] 2670 - 연속부분최대곱 (Python, JavaScript) 본문

알고리즘

[BOJ] 2670 - 연속부분최대곱 (Python, JavaScript)

흙금 2023. 5. 29. 13:18

 

 

아이디어

 

DP로 현재 수까지의 곱과 현재 수를 비교하여 갱신하면서 곱의 최댓값을 저장해 나간다.

 

 

풀이 #1 (Python)

 

이 문제가 그리디인지 DP인지 고민했는데, 이전 값이 현재 선택에 영향을 미치기 때문에 DP라고 이해했다.

 

import sys

input = sys.stdin.readline

def solution():
    N = int(input())
    temp = 1
    res = 0
    for i in range(N):
        number = float(input())
        temp *= number
        if number > temp:
            temp = number
        if temp > res:
            res = temp
    print(f'{res:.3f}')

solution()

 

 

아래 테스트 케이스 수들의 곱은 1185.9705로, 소수점 이하 넷째 자리에서 반올림하면 1185.971이 된다.

하지만 실수 계산의 오차를 감안하여 이 문제에서는 1185.970를 출력하는 코드도 허용된다.

파이썬에서는 반올림하는 자리의 숫자가 5인 경우 앞 숫자가 홀수면 올림, 짝수면 내림하는 오사오입 방식을 사용한다.

4
1.3
9.9
9.7
9.5

 

 

 

풀이 #2 (JavaScript)

 

자바스크립트에서도 반올림 시 오사오입 방식이 사용된다.

 

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');

function solution() {
    const N = Number(input[0]);
    let temp = 1;
    let res = 0;
    for (let i=1; i<=N; i++) {
        number = Number(input[i]);
        temp *= number;
        if (number > temp) temp = number;
        if (temp > res) res = temp;
    }
    console.log(res.toFixed(3));
}

solution();

 

Comments