본문 바로가기
반응형

Programming/Project Euler115

18. 프로젝트 오일러 #18 : 삼각형 수들의 최대값 경로 구하기 이번 프로그램은 개인적으로도 재미있을 것 같았습니다. 가장 중요한 알고리즘은 바로 동적 프로그래밍(Dynamic Programming)입니다. 실제 경로 문제 중 최적값 찾기에는 동적 프로그래밍 기법을 자주 사용하게 되는데, 이 프로그램 역시 마찬가지입니다. 해당 사이트 문제에서도 그런 점을 언급하기는 했지만, 동적 프로그래밍을 사용하지 않는다면, 경로의 수가 많은 경우에는 매우 많은 연산을 하게 됩니다. 이번 문제는 경로의 수가 16,384가지가 나옵니다. 왜냐하면 각 층의 숫자마다 경로가 2가지씩 나오니까요. 총 15층이므로, 총 경로의 수는 가 됩니다. 그러나 동적 프로그래밍을 이용하면, 실제 경로의 수 계산은 총 숫자의 갯수인 120가지밖에 안 됩니다. #67 문제에 100층짜리 문제가 나온다고 .. 2015. 1. 14.
17. 프로젝트 오일러 #17 : 영어 단어의 글자수 세기. 이번 문제는 문제 자체의 난이도보다는, 영어 단어를 세는 것 자체가 너무 짜증났던 문제입니다. 그리고 우리가 보통 사용하지 않는 'and'까지 쳐서 해주어야 하니까요. 답을 썼는데 계속 틀리다고 나와서, 왜 그런가 했더니, 제가 글자수 하나를 더 쳤네요. 18 과 80 때문에 둘다 그랬네요. 단순하게 8(eight) + 'teen' 과 8(eight) + 'ty' 로 해서 5+4, 5+2 했던 것이 문제였네요. 그냥 #1 부터 계속 풀어보자 생각했던터라, 이 문제를 풀고 싶지는 않았지만, 그냥 풀어 보았습니다. #include int main() { int wc[20] = { 0, 3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8 }; int wct[20.. 2015. 1. 14.
16. 프로젝트 오일러 #16 : 2의 1000승의 모든 자릿수 합 구하기. 사실 이번 프로그램은 Big integer를 사용할 줄 아느냐 아니냐에 따라서 달라진다고 봅니다. 많은 언어가 기본으로 Big Integer를 지원하기 때문에, 언어에 따라서 구현 난이도도 차이가 많을겁니다. 예를 들어서 python을 이용하면, 가볍게 이 문제를 해결할 수 있습니다. >>> 2**1000 10715086071862673209484250490600018105614048117055336074437503883703510 51124936122493198378815695858127594672917553146825187145285692314043598 45775746985748039345677748242309854210746050623711418779541821530464749 8358194126.. 2015. 1. 13.
프로젝트 오일러 #15 격자 경로의 수 구하기 사실 이번 문제는 상당히 쉬운 편이라서 그다지 설명이 필요할 것도 없을 듯 합니다. 다른 프로그래머도 저랑 비슷한 접근을 했고요. 2014년 년 마지막 날을 이렇게 보내네요. 예를 들면 2x2 격자에서 오른쪽과 아래로만 갈 수 있는 경로의 수는, 오른쪽 이동을 R, 아래 이동을 D라 표현하면 다음과 같습니다. RRDD RDRD RDDR DRRD DRDR DDRR 위와 같이 총 6가지의 경우가 나옵니다. 이 중에 R만을 가지고 따진다면, 4개의 칸 중에 2개의 R을 배치하는 방법의 수입니다. 프로젝트 오일러의 문제 링크입니다. https://projecteuler.net/problem=15 Problem 15 - Project Euler Starting in the top left corner of a 2.. 2014. 12. 31.
14. 프로젝트 오일러 #14 : 최대 체인을 가지는 우박수 구하기 이번 문제는 동적 프로그래밍을 이용해서 작성을 하는 것이 가장 좋을 듯 합니다. 우박수를 구하다보면, 이미 전에 계산했던 우박수 체인수가 있을 수 있습니다. 그렇게 하지 않으면, 체인수가 100여개 있는데, 1,000,000까지 구한다면, 1억번정도 평균적으로 계산해야 합니다. 동적 프로그래밍을 이용하면, 이 수를 줄일 수 있습니다. 물론 수가 1이 된다는 가정하에서 이야기지만, 현재까지 예외는 없으니까요. 사실 수학적으로 1,000,000까지 우박수가 된다는 것을 확인하면, n/2로 건너뛰기를 하기 때문에 반드시 우박수가 될 수밖에 없습니다. 순수한 수학적인 증명만으로는 할 수 없지만요. 물론, 자꾸 홀수에 걸쳐서 숫자가 비대해질 수는 있습니다만, 3n+1 은 반드시 짝수가 되기 때문에 홀수가 연달아 .. 2014. 12. 30.
13. 프로젝트 오일러 #13 : BigInt 수의 합 구하기 사실 이번 문제는 꼼수로 푸는 것이 맞을 듯 합니다. BigInt 라이브러리를 이용해서 풀어도 되겠지만, 그렇게 하면 시간이 많이 걸리죠. 앞자리부터 10자리 숫자만 구하면 되는 것이니까요. 그렇게 하면 int형으로는 위험할지 몰라도 int64형으로는 충분한 자릿수가 됩니다. 32비트 자료형은 10의 9승정도를 표현할 수 있으니까요. 64비트는 10의 19승까지 표현할 수 있죠. 여기에 소스만 올리도록 할께요. 특별하게 설명할 일은 없는 듯 합니다. #include int main() { char *s = "37107287533902102798797998220837590246510135740250" "46376937677490009712648124896970078050417018260538" // 데이터.. 2014. 12. 30.
728x90