x = ⌊ √( r*r - i*i ) ⌋
4. i를 1부터 150까지 증가시키며 각 값을 더해준다.
위 공식의 결과와 소스는 아래 참조.
<script language="Javascript" type="text/javascript"> function countRectFillCircle1(diam){ var r = diam/2; var cnt = 0; for(var i=0; i < r; i++){ var temp = Math.sqrt(r*r - (i+1)*(i+1)); cnt += parseInt(temp); } return cnt*4; } </script>여기까지가 기본적인 알고리즘이고... 여기에서 각 줄을 볼때 내림을 하기 전의 소수점 이하 값이 0.5가 넘는다면... 해당 줄을 좌측 혹은 우측으로 밀면 그 줄에 하나의 사각형이 더 들어올 수 있다는 것을 알 수 있다. 그리고 그러한 값을 구하기 위해서는 내림을 하기 전에 0.5를 더해서 내림을 해준다. 위의 줄의 8번째와 10번째 줄을 아래와 같이 바꾸면 OK. 위 공식의 결과와 소스는 아래 참조.
<script language="Javascript" type="text/javascript"> function countRectFillCircle2(diam){ var r = diam/2; var cnt = 0; for(var i=0; i < r; i++){ var temp = Math.sqrt(r*r - (i+1)*(i+1)); cnt += parseInt(temp+0.5)*2; } return cnt*2; } </script>하지만 아직 만족스러운 결과는 아니다. 좌우로 밀 수 있다면 위 아래로도 밀수 있다. 하지만 각 줄이 라인을 이루어있는 만큼 위와 같은 방법으로는 안되고, 아마도 통채로 미는 것이 가장 좋은 방법이지 않을까? 이제 더이상 (0,0) 점에서 시작하는 알고리즘은 안되고, 시작점을 바꿔보자. 반지름(r)에서 시작한다면 당연하겠지만 사각형은 잘려 나갈 것. 그래서 (r-0.5)에서 시작. 물로 최대값을 구하기 위해 위쪽으로 최대로 밀어주는 과정을 한번 거쳐본다. 말로 설명은 이만.... 더이상은 어떻게 설명해야 할지도 모르겠고.... 위 공식의 결과와 소스는 아래 참조.
<script language="Javascript" type="text/javascript"> function countRectFillCircle3(diam){ var r = diam/2; var i = (diam-1)/2; var cnt = 0; i = parseInt(Math.sqrt(r*r - i*i)); i = -Math.sqrt(r*r - i*i); for(;i+1 < r;i++){ var temp = Math.sqrt(r*r - (i+1)*(i+1)); cnt += parseInt(temp+0.5)*2; } return cnt; } </script>더이상은 힘드네요.
일단 이게 정답이라는 것을 증명할 수는 없군요.
최소 이정도 이상은 채울 수 있다는 것을 증명할 수 있는 정도(?).
정말 간단한 문제 인데 막상 고교수학으로 풀려니 어렵네요.
답글삭제적분 전단계인 구분구적법으로 하면 될것 같기도 한데 재밌네요.
구분구적법이라..... 한번 시간날때 찾아봐야겠네요. 기억이 가물가물.....
삭제흠... 찾아보니 제가 생각하던 그 아이가 맞네요....
삭제뭐 따지고 보면 위의 방법이 구분구적법의 응용이라고 봐야하나....
아무튼 큰 도움은 안 될듯도요....