백주 1456번
200
投稿した質問数 8
for (int i = 2; i <= 10000000; i++)
{
if (num[i] != 0)
{
long long temp = num[i];
while ((double)num[i] <= (double)B/(double)temp && (double)num[i] >= (double)A / (double)temp)
{
count++;
temp = temp * num[i];
}
}
}
풀이와 다르게 while 문에서 min값까지 판단하게되면 왜 답이 달라지는건지 모르겠습니다.
어떤 값을 count 못하게 되는건지 모르겠습니다
回答 1
0
안녕하세요, 인프런 AI 인턴입니다.
winwincs님, 질문 주셔서 감사합니다.
코드 내용에 대해 설명드리면, 여기서 num 배열은 소수들을 담고 있는 것으로 추정됩니다. 배열 안의 각 소수에 대해 거듭제곱한 값이 A와 B 사이에 있는지 확인하는 로직으로 보입니다.
while 문의 조건은 num[i]를 temp로 거듭제곱한 값이 A 이상이고 B 이하일 동안 count를 증가시키는 것입니다. 문제는 num[i]가 실수로 변환되었을 때, 부동소수점 연산의 오차 때문에 정확한 비교가 어려울 수 있다는 점입니다.
min 값까지 판단하면서 답이 달라지는 부분은, 이 부동소수점 연산 오차 때문에 정확한 범위 판단이 이루어지지 않거나, 배정밀도(double)의 한계로 인해 매우 큰 정수 값에 대한 비교가 정확하지 않을 수 있습니다. 그 결과 일부 값을 계산에서 누락하거나 잘못 포함할 수 있습니다.
부동소수점 연산 오차를 줄이기 위해서는 정수 연산을 사용하는 것이 좋은데, 이 경우 while 조건을 다음과 같이 변경할 수 있습니다:
while (temp <= B / num[i] && temp >= A / num[i]) {
count++;
temp *= num[i];
}
이렇게 하면 temp 값이 A보다 크거나 같고 B보다 작거나 같을 때까지 반복하며 count를 증가시키게 됩니다. 그럼 필요한 정수의 범위 안에서 정확한 판단이 가능하게 됩니다.
참고로 현재 코드의 temp 값이 매우 커질 경우, 실수로의 변환 과정에서 오차가 발생할 수 있기 때문에 이런 연산 방식을 권장드립니다.
추가적으로, 해당 알고리즘과 코딩테스트에 관한 강의나 자료가 필요하시다면 인프런에서 관련 강의를 찾아보시는 것도 좋을 것입니다.
수강평 이벤트
0
17
2
Reticle이 안나옵니다.
0
10
1
진행 방법 질문드립니다!
0
30
2
안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.
0
19
1
Singleton 관련 질문입니다.
1
31
2
갑자기 채점 사이트가 바뀌었어요
0
19
1
42. [세그먼트 트리 실전 문제] 구간 합 구하기3 (백준 2042)
0
64
1
10986번 질문 있습니다!
0
45
0
LCA 빠르게 찾기 - 트리의 높이에 따른 k값 질문
0
120
0
백준 1377 질문있습니다
0
218
1
백준 1722 교재 81 질문
0
331
1
백준11505, 교재 73번
0
282
1
백준 1325, 교재 47번 문제 질문입니다.
0
358
1
백준 11404 플로이드 문제 질문있습니다.
0
260
1
문제 85번 질문드립니다
0
322
1
백준 13023 질문있습니다.
0
205
1
문제 8번 질문드립니
0
306
1
백준 1876여행 유니온 파인드 질문있습니다.
0
241
1
백준 2251 C++ 질문 있습니다.
0
398
2
퀵정렬 질문
3
292
1
i==k일떄 i++안해도되지않나요
0
437
1
알고리즘 코딩테스트 문제풀이 강의 - 14 절댓값 힙 구현하기 (백준 11286)
0
550
1
알고리즘 코딩테스트 문제풀이 강의 - 9 DNA 비밀번호 (백준 12891)
1
573
1
C++은 실전문제에 대한 강의가 없나요? 자바나 파이썬은 있는데 없는거 같아서요.
2
592
2

