<a target="_blank" href="http://codingdojang.com/scode/350" target="_blank">http://codingdojang.com/scode/350</a> <div><br></div> <div>이 문제를 보고 풀이를 생각했습니다.</div> <div><br></div> <div>c/c++/c#기준입니다.</div> <div><br></div> <div>처음에는 다른 사람들 처럼 다음과 같은 풀이를 생각했습니다.</div> <div><br></div> <div><div>int sum = 0;</div> <div>for (int i = 1; i < 1001; i++)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (i % 3 == 0 || i % 5 == 0)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>sum += i;</div> <div>}</div></div> <div><br></div> <div>1~1000까지 반복문으로 전부 돌면서 3이나 5의 배수이면 결과값에 더해주는거죠.</div> <div>그런데 이게 무조건 확정적으로 1000번을 돈다는게 마음에 안 들더라구요.</div> <div><br></div> <div><br></div> <div>그래서 다음엔 코드는 좀 길어지지만 for문을 덜 돌게 수정을 해봤습니다.</div> <div><br></div> <div><div>int sum = 0;</div> <div>for (int i = 3; i < 1001; i += 3)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>sum += i;</div> <div>}</div> <div>for (int i = 5; i < 1001; i += 5)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>sum += i;</div> <div>}</div> <div>for (int i = 15; i < 1001; i += 15)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>sum -= i;</div> <div>}</div></div> <div><br></div> <div>이번에는 3의 배수와 5의 배수를 주륵 더하고, 3과 5의 공배수(15의 배수)는 겹쳐서 두번 들어갈테니 한번 빼줬습니다.</div> <div>그러면 333 + 200 + 66 = 599번만 반복문을 돌게됩니다.</div> <div>길이와 가독성을 희생했지만 반복량은 절반도 줄이지 못 했습니다.</div> <div><br></div> <div><br></div> <div>이에 아예 반복문을 안 돌수는 없을까? 라는 생각을 가지고 다음과 같은 방식을 떠올렸습니다.</div> <div><br></div> <div><br></div> <div>일단 3의 배수 총합은. 배수들의 총 갯수(3,6,9면 3개) 곱하기 3. 이죠.</div> <div>즉 3+6+9 = 3 * (1+2+3)</div> <div>마찬가지로 5의 배수 총합은</div> <div>5 + 10 + 15 = 5 * (1 + 2 + 3)</div> <div><br></div> <div>그리고 자연수의 총합은 중학생인가 고등학생때 배우던가요?</div> <div>예를 들어 1~n까지 더하는거면. (1 + n) * n / 2</div> <div><br></div> <div>즉 1~1000 중에서 3의 배수의 총합을 구하는 식은</div> <div>1~1000까지 3의 배수 갯수는 1000 / 3 (나머지 버림) = 333개.</div> <div>3 * (1 + 333) * 333 / 2</div> <div><br></div> <div>이런 공식을 하나의 함수로 정의하자면.</div> <div><br></div> <div>//multiple = 배수. maxNum = 최대 수(이 문제의 경우 1000)</div> <div><div>int GetMultipleSum(int multiple, int maxNum)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int count = maxNum / multiple;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>return multiple * ((1 + count) * count / 2);</div> <div>}</div></div> <div><br></div> <div>그리고 3과 5의 배수의 총합은 두번째 풀이때 언급했듯이.</div> <div>3의 배수 총합 + 5의 배수 총합 - 15의 배수 총합</div> <div>int sum = GetMultipleSum(3, 1000) + GetMultipleSum(5, 1000) - GetMultipleSum(15, 1000);</div> <div><br></div> <div>이렇게 하면 반복문 없이 바로 답이 나오네요.</div> <div>이 보다도 더 좋은 방법이 있을 것 같긴한데. 아이디어가 안 떠오르네요.</div>
<a href="http://activexxx.mooo.com/ouavatar/ouavatar_menu.php" target="_blank"><img src="http://activexxx.mooo.com/ouavatar/ouavatar.php?start=true&language=ko_kr&text_direction=ltr&mn=92778&about1=%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94&about2=%EC%9E%89%EC%97%AC%EC%9D%B8%EA%B0%84%EC%9E%85%EB%8B%88%EB%8B%A4&nick_icon=star&star_color=FFA500&background_color=ADD8E6&text_color=000000&about_color=0E76DC&body_num=1&body_color=A52A2A&oumark_color=FF8C00&oumark_gloss_opacity=30&squid_num=1&squid_left_direction=down&squid_right_direction=down&skin_color=ffb273&hair_num=1&hair_color=450000&blush_num=1&blush_color=ff8973&brow_num=1&brow_color=450000&eyes_num=1&eyes_color=FFFFFF&pupil_color=450000&glasses_num=0&glasses_border_color=000000&glasses_lens_color=ADD8E6&glasses_opacity=50&nose_num=1&nose_color=450000&mouth_num=1&mouth_color=7B220B&tongue_color=FF6B70&teeth_color=FFFFFF&bottom_color=FF6B70&bottom_num=1&rotate=0&crop=0&hyperlink=http%3A%2F%2Factivexxx.mooo.com%2Fouavatar%2Fouavatar_menu.php&end=true&isold&.png" alt="오늘의유머 꼬릿말 서비스 by ActiveXXX"></a>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.