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

윽쓰욱스님의 프로필 이미지
윽쓰욱스

작성한 질문수

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

6-J

6_J 질문드려요.

작성

·

143

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

안녕하세요.

강의 잘 듣고 있습니다.

 

다름이 아니라.

ll right = 1E18로 지정하면 제출시 틀렸습니다가 뜨고, ll right = 1E15 정도로 하면 정답이 뜨는데,

 

mid 의 값계산이 잘못되고 있는건가 체크해봐도 오버플로우가 날만한게 없어서. 이유가 궁금합니다.

 

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
ll N, M;
vector<ll> A;
ll temp;

bool check(ll mid){

    temp = M;
    for(int i =0 ; i < M ; ++i){
        temp += mid/A[i];
    }

    return temp >= N;
}


int main(){
    cin >> N >> M;
    A = vector<ll>(M,0);
    for(int i = 0 ; i < M ; ++i) cin >> A[i];

    if ( N <= M) cout << N << endl;
    else{

        ll left = 0;
        ll right = 1E18;
        ll ret = 0;
        while(left <= right){
            ll mid = (left+right)/(long long)2;

            if(check(mid)){
                right = mid-1;
                ret = mid;
            }
            else{
                left = mid+1;
            }
        }
        temp = M;
        for(int i =0 ; i < M ; ++i) temp += ((ret-1)/A[i]);

        for(int i =0 ; i < M ; ++i){
            if (ret % A[i] == 0) temp++;
            if (temp ==N){
                cout << i +1 << "\n";
                return 0;
            }
        }
    }
 
    return 0;
}

답변 2

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 욱쓰님 ㅎㅎ

보통은 1e18로 해도 맞습니다. 다만 이 문제의 경우

해당 right를 기반으로 mid를 설정하고

bool check(ll mid){

    temp = M;
    for(int i =0 ; i < M ; ++i){
        temp += mid/A[i];
    }

이렇게 mid를 더하는 부분이 있습니다. 이 때 오버플로우가 발생할 수 있습니다.

1e18의 경우..



또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

0

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

윽쓰욱스님의 질문과 관련하여 ll right = 1E18로 지정했을 때 오답이 나오는 문제에 대한 답변이 이미 제공된 적이 있습니다. 본 문제는 long long 자료형의 범위와 오버플로우 가능성에 관련된 내용을 포함하고 있습니다.

같은 문맥에서 이전에 다룬 답변에서는, 보통 long long 자료형을 사용할 때 1E18와 같은 큰 수를 경계값으로 설정하는 것이 일반적이지만, 특정 조건에서 오버플로우 현상이나 예상치 못한 결과가 발생할 수 있음을 언급합니다.

이러한 문제의 해결 방안으로는 문제에서 요구하는 특정 범위를 기반으로 최대값을 조정하는 방법이 제시되었습니다. 구체적으로, 계산 과정에서 중간값 mid에 대한 연산이나 결과값의 저장 과정에서 오버플로우를 피하기 위해 보다 안전한 범위의 최댓값을 선택하는 것이 좋습니다.

이와 유사한 문제 해설을 찾으실 수 있는 링크는 다음과 같습니다:
- 6-J 질문 드립니다. - 이 링크에서는 long long의 범위 내에서도 정의한 최댓값이 문제의 특정 조건에서 오답을 유발할 수 있음을 논의하고 있습니다. 6-J 질문과 윽쓰욱스님의 상황이 유사하며, 해당 답변이 윽쓰욱스님의 질문에 도움이 될 것으로 보입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

윽쓰욱스님의 프로필 이미지
윽쓰욱스

작성한 질문수

질문하기