작성
·
280
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;
}
아뇨아뇨 ㅎㅎ
google님의 생각은 타당합니다. 괜찮은 접근법이에요 ㅎㅎ
다만 누적곱을 해도 기존 N^2에서 나아지는 그런 코드는 아닙니다. 어차피 나누기를 계속해야하기 때문에...
그치만 생각자체는 타당합니다. 저도 틀린 점을 찾고는 싶은데 잘 안되네요 ㅠㅠ
감사합니다.
1
안녕하세요 google님 ㅎㅎ
해당 코드 2일전부터 제가 여러번 시도해봤는데 틀리네요...
흠...
부동소수점
초기값
max 부분 로직 조정
이렇게 3가지 파트기반으로 디버깅을 계속했는데도 잘 안되네요...
좀 더 해보고 반례나 틀린 부분 찾으면 다시 답변 달겠습니다.
부족한 답변 죄송합니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
누적곱을 이용한 문제 풀이에 있어서는, 기본적인 로직의 접근 방식은 올바를 수 있습니다. 누적곱을 활용하여 일정 범위 내의 모든 수의 곱을 O(1)에 접근할 수 있으므로, 이전에 계산한 값을 재활용하는 방식은 효율적입니다. 하지만, “답이 틀렸다”고 나오는 경우는 로직을 잘못 이해했거나 구현 과정에서 누락된 부분이 있을 가능성이 높습니다.
배열 인덱스 확인: a[i]를 a[j]로 나누는 과정에서 배열의 인덱스를 잘못 사용하지 않았는지 확인이 필요합니다. 특히, 문제에서 요구하는 범위와 실제 배열 인덱스 사이의 관계가 올바르게 설정되었는지 점검해야 합니다.
나눗셈 연산 중 오류: 특히, 정수 나눗셈의 경우 나누기 전후로 값의 변화가 있을 수 있기 때문에, 나눗셈의 결과가 예상과 다르게 나오지 않았는지 검토해 보세요.
오버플로 및 언더플로 주의: 사용한 데이터 타입의 한계를 넘어서는 연산 즉, 오버플로(가장 큰 수를 넘어서는 연산) 혹은 언더플로(가장 작은 수보다 더 작은 값을 가지는 연산)가 발생하지 않았는지 확인해볼 필요가 있습니다. 특히, 큰 수의 누적곱을 다루다 보면 쉽게 오버플로가 발생할 수 있습니다.
최적화의 필요성: 또한, 문제의 시간 제한을 고려하여 이중 반복문을 사용하는 것 외에 더 효율적인 방법을 고려해야 할 수도 있습니다. 예를 들어, 투 포인터 알고리즘 등 다른 알고리즘을 적용해 볼 수도 있습니다.
이와 같은 점들을 체크해보시고, 구현하신 코드를 다시 한 번 점검해 보시길 바랍니다. 문제 해결에 필요한 부분을 놓치지 않고 모두 고려했는지 확인해 보세요. 코드를 다시 살펴보는 과정에서 문제의 소스를 찾을 수 있을 겁니다.
위의 정보를 바탕으로 문제를 해결하시길 바랍니다. 추가적인 질문이나 궁금한 점이 있으시면 언제든지 물어보세요.
선생님 감사합니다~~~!
선생님이 강의때 강조하시는, 해보고 안되면 다른방법을 얼른 찾는 유연한 사고방식을 길러야겠어요. 감사드립니다~!
그런데, 누적곱을 이용한다는 생각이 잘못된 걸까요??
N^2으로는 풀리지만, 누적곱으로는 풀리지 않는 걸까요??