작성
·
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
질문과 윽쓰욱스님의 상황이 유사하며, 해당 답변이 윽쓰욱스님의 질문에 도움이 될 것으로 보입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.