• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

누적곱을 이용한 풀이

24.05.04 21:25 작성 조회수 111

0

http://boj.kr/480d56cedce24b1887732ad80aad6c12

 

선생님, 안녕하세요~

이번 문제를 풀때 누적곱을 이용했는데요.

제일 앞부분에 1을 넣어놓고, n+1번째에 누적곱을 넣은 누적곱의 배열을 만들었습니다.

그리고, 이중 반복문을 진행하면서

a[i]를 a[j]로 나눠보며 최대값을 구해봤는데요. (a[0]는 1이라서, a[i]를 a[0]로 나누면 i번째 까지의 누적곱, 그 이후부터는 연속된 앞부분으로 나눈 것)

이중반복문으로 했다보니 시간초과가 나면 그렇구나 할텐데, 답이 틀렸다고 하니, 어디가 틀렸는지 잘 모르겠습니다.

처음부터 잘못 생각한 걸까요? 아니면 코드를 어딘가 잘못짠 부분이 있는걸까요?

답변 3

·

답변을 작성해보세요.

1

google님 일단은 N^2으로도 풀어서 맞는 코드는 다음과 같습니다.

저는 이렇게 풀어봤는데요. ㅎㅎ

일단은 참고 부탁드립니다.

#include <bits/stdc++.h>   
using namespace std; 
double go(const vector<double>& nums) {
    int n = nums.size();
    double mx = -1e9;  
    for (int start = 0; start < n; ++start) {
        double curr = 1.0; 
        for (int end = start; end < n; ++end) {
            curr *= nums[end];
            mx = max(mx, curr);
        }
    } 
    return mx;
}

int main() { 
    int n;
    cin >> n;
    
    vector<double> nums(n); 
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }
     
    double ret = go(nums); 
    cout << fixed << setprecision(3) << ret << endl;
    
    return 0;
}

 

선생님 감사합니다~~~!
선생님이 강의때 강조하시는, 해보고 안되면 다른방법을 얼른 찾는 유연한 사고방식을 길러야겠어요. 감사드립니다~!

그런데, 누적곱을 이용한다는 생각이 잘못된 걸까요??

N^2으로는 풀리지만, 누적곱으로는 풀리지 않는 걸까요??

아뇨아뇨 ㅎㅎ

google님의 생각은 타당합니다. 괜찮은 접근법이에요 ㅎㅎ

다만 누적곱을 해도 기존 N^2에서 나아지는 그런 코드는 아닙니다. 어차피 나누기를 계속해야하기 때문에...

그치만 생각자체는 타당합니다. 저도 틀린 점을 찾고는 싶은데 잘 안되네요 ㅠㅠ

감사합니다.

1

안녕하세요 google님 ㅎㅎ

해당 코드 2일전부터 제가 여러번 시도해봤는데 틀리네요...

흠...

  1. 부동소수점

  2. 초기값

  3. max 부분 로직 조정

     

     

    이렇게 3가지 파트기반으로 디버깅을 계속했는데도 잘 안되네요...

좀 더 해보고 반례나 틀린 부분 찾으면 다시 답변 달겠습니다.

 

부족한 답변 죄송합니다.

 

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.05.06

안녕하세요, 인프런 AI 인턴입니다.

누적곱을 이용한 문제 풀이에 있어서는, 기본적인 로직의 접근 방식은 올바를 수 있습니다. 누적곱을 활용하여 일정 범위 내의 모든 수의 곱을 O(1)에 접근할 수 있으므로, 이전에 계산한 값을 재활용하는 방식은 효율적입니다. 하지만, “답이 틀렸다”고 나오는 경우는 로직을 잘못 이해했거나 구현 과정에서 누락된 부분이 있을 가능성이 높습니다.

  1. 배열 인덱스 확인: a[i]를 a[j]로 나누는 과정에서 배열의 인덱스를 잘못 사용하지 않았는지 확인이 필요합니다. 특히, 문제에서 요구하는 범위와 실제 배열 인덱스 사이의 관계가 올바르게 설정되었는지 점검해야 합니다.

  2. 나눗셈 연산 중 오류: 특히, 정수 나눗셈의 경우 나누기 전후로 값의 변화가 있을 수 있기 때문에, 나눗셈의 결과가 예상과 다르게 나오지 않았는지 검토해 보세요.

  3. 오버플로 및 언더플로 주의: 사용한 데이터 타입의 한계를 넘어서는 연산 즉, 오버플로(가장 큰 수를 넘어서는 연산) 혹은 언더플로(가장 작은 수보다 더 작은 값을 가지는 연산)가 발생하지 않았는지 확인해볼 필요가 있습니다. 특히, 큰 수의 누적곱을 다루다 보면 쉽게 오버플로가 발생할 수 있습니다.

  4. 최적화의 필요성: 또한, 문제의 시간 제한을 고려하여 이중 반복문을 사용하는 것 외에 더 효율적인 방법을 고려해야 할 수도 있습니다. 예를 들어, 투 포인터 알고리즘 등 다른 알고리즘을 적용해 볼 수도 있습니다.

이와 같은 점들을 체크해보시고, 구현하신 코드를 다시 한 번 점검해 보시길 바랍니다. 문제 해결에 필요한 부분을 놓치지 않고 모두 고려했는지 확인해 보세요. 코드를 다시 살펴보는 과정에서 문제의 소스를 찾을 수 있을 겁니다.

위의 정보를 바탕으로 문제를 해결하시길 바랍니다. 추가적인 질문이나 궁금한 점이 있으시면 언제든지 물어보세요.