작성
·
166
0
안녕하세요, 선생님 강의 잘 듣고 있습니다!
6-L 을 풀던 도중, 제 풀이 방법이 틀렸다고 나와 반례가 궁금합니다.
시간 복잡도는 O(n* n/2) 이라 통과 한다고 생각합니다.
A[i]에 10을 곱한것은 혹시 모를 부동 소수점 오류가 날지 몰라 처리 해두었습니다.
https://www.acmicpc.net/source/70768639
답변 2
0
0
안녕하세요 동훈님 ㅎㅎ
for (int i =0; i < n; i++){
double temp = 1;
int cnt = 1;
for (int j = i; j < n; j++){
temp *= A[j];
코드를 보시면.. O(N^2)인데 이문제의 최대범위N = 1만. 즉, 동훈님이 작성하신 1억짜리 시간복잡도를 가지는 코드입니다. 물론 5000만이지만요(상수 포함하면)
이 정도면 시간초과가 날수도 있습니다.
제가 1000만이면? 1억이면? 시간초과가 날 수도 있다. 이거 좀 효율적으로 할 수 있지 않을까? 하고 들어가라고 말씀드렸는데요.
즉,
아 좀 많은 것 아닌가? 생각을 먼저하는게 1st.
그리고 나서 더이상 N^2말고 방법이 없다? 그러면 한번 들어가는게 2nd입니다.
자 그럼 코드리뷰 해볼게용.
동훈님 코드 리뷰
소수점 첫째자리까지 주어지며, 0.0보다 크거나 같고, 9.9보다 작거나 같다.
이 특성을 이용해서 * 10을 곱해서 하신 것 같습니다. 이외에도 pow를 사용해서 정수형으로 해결하려고 하신 것 같습니다.
ans = max(ans, double(temp / pow(10,cnt++)) );
근데 이런 걸 또 보면... 갑자기 형변환을 해서 double형인 ans와 비교하는데. 차라리 long long으로 아예 크게 잡고 long long과 비교하다가 마지막에 double로 변환하는게 좋을 것 같습니다.
그리고 cout은 소수점까지 출력하려면 이런 코드같은게 필요합니다. 이부분이 없었습니다.
참고로 자세한 부분은 다음의 교안을 참고해주세요.
cout.precision(자릿수 + 1);
즉, 전체적으로는 어떤 로직인지는 알겠으나 불필요한 부분, 다듬어야 할 부분이 있었습니다.
제가 한번 다듬어 봤습니다. ㅎㅎ
이런 로직을 원하셨던게 아닌가요?
(이 코드는 통과합니다.)
#include<bits/stdc++.h>
using namespace std;
int n;
double num;
double A[10010];
int main(){
cin >> n;
for (int i =0; i < n; i++){
cin >> A[i];
}
double ans = 0;
for (int i = 0; i < n; i++){
double temp = 1;
for (int j = i; j < n; j++){
temp *= A[j];
ans = max(temp, ans);
}
}
printf("%.3lf", ans + 0.00001);
}
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.