tanitani2   2년 전

코딩은 이론만 배우다 문제는 최근에 처음 풀기 시작해본 초보입니다.

반례가 눈에 띄지 않는 경우에 보통은 어떤 방식들을 통해서반례들을 찾는지도 여쭙고싶습니다.

감사합니다.

choah76   2년 전

우선 질문자분의 코드 10번째줄 while문의 조건이 잘못되었습니다.

예를 들어 입력이 10, 20으로 주어졌다고 생각해봅시다.

이때 root는 2부터 시작하므로, 8번째줄의 while문은 root^2 = 4부터 반복을 시작합니다.

2^2의 배수는 모두 제곱 ㄴㄴ수가 아니므로, 12 16 20은 제곱 ㄴㄴ수가 아니게 됩니다.

그러나, 질문자님의 코드 10번째 줄에서는 root**2*mlp가 min보다 클 경우에 대해서만 반복을 시행합니다. 반복문의 첫 번째 경우, root^2 =4 일때 mlp = 1이므로 

root**2*mlp = 4 < 10이므로, root = 2인 경우에 대해서는 반복문에서 제곱ㄴㄴ수인지를 검사하지 않습니다. 

위에서 말했듯이 root가 2인 경우에도 12, 16, 20을 걸러내야 하는데 말이죠.

결국 질문자님의 코드는 root**2 > 10 인, root = 4부터 검사를 시작하게 되고 틀린 값을 도출하게 되는 것입니다.

입력 : 10 20

출력 : 10

정답 : 7

choah76   2년 전

그리고 반례를 찾는 방법은 결국 디버깅을 통해서 찾아내야 합니다.

복잡하지 않은 경우(손으로도 풀 수있을 정도)에 대해 변수들의 값을 임시로 출력하게 하여 모든 경우를 다 따지는지, 올바른 값을 도출하는지를 확인하는 것입니다.

이 문제같은 경우에는 root**2*mlp의 값을 매 반복마다 출력하게 하여 제곱ㄴㄴ수를 제대로 걸러내는지를 확인할 수 있겠습니다.

또한 극단적인 경우에 대해서도 값을 넣어 에러가 나는지 등을 테스트해볼 수 있습니다. 

이 문제같은 경우 min, max값이 동일한 경우 (15, 15), min, max값의 차이가 최대(1,000,000)인 경우, min이 최대값인 경우 (1,000,000,000) 등이 있습니다.

댓글을 작성하려면 로그인해야 합니다.