인프런 커뮤니티 질문&답변

김동훈님의 프로필 이미지
김동훈

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

6-L

6-L 질문합니다

작성

·

166

0

안녕하세요, 선생님 강의 잘 듣고 있습니다!
6-L 을 풀던 도중, 제 풀이 방법이 틀렸다고 나와 반례가 궁금합니다.

시간 복잡도는 O(n* n/2) 이라 통과 한다고 생각합니다.

A[i]에 10을 곱한것은 혹시 모를 부동 소수점 오류가 날지 몰라 처리 해두었습니다.

https://www.acmicpc.net/source/70768639

답변 2

0

김동훈님의 프로필 이미지
김동훈
질문자

cout 으로 그냥 출력하면 소수점 일부분을 날리는군요..
답변 감사합니다!!

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의 실수 타입 출력
 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점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.


김동훈님의 프로필 이미지
김동훈

작성한 질문수

질문하기