프로젝트 오일러 57
projecteuler, cpp난이도 5% 의 문제였지만 많은 오답을 냈고, 답을 내는 코드를 짜기까지 지긋지긋하게 오랜 시간이 걸렸다. 절대 다시 풀고 싶지 않아!!
답을 구해나가는 방법 자체는 간단하다. 큰 수를 다룰 수 있는 클래스( 언어 차원에서 지원한다면 필요가 없고)를 써서, 다음 차례 분모와 분자에 어떤 수가 들어올지 생각해보고, 점화식을 코드로 표현하면 된다.
점화식은 대충 다음과 같다.
BigInt numerator, denominator;
...
BigInt swap = numerator;
numerator = numerator + denominator + denominator;
denominator = swap + denominator;
...
내가 며칠간 삽질한 과정을 적어 보자면..
일단 문제에서 분수를 확인하자마자 더 생각해보지 않고 오일러 33번 문제의 분수용 Fraction 클래스를 써서 풀려고 시작한것부터 꼬였다. Fraction 클래스를 써서 풀다보니 이 클래스로는 큰 분모, 큰 분자 를 다룰수가 없다는 것을 알았고, 큰 수(BigInt) 클래스를 Fraction 클래스로 포팅하면서 크고 작은 삽질을 했고, BigInt 클래스에서 *,/,%,-,+ operator 들을 구현하면서 삽질을 한참 했다.
결과적으로 Fraction 클래스는 쓸 필요가 없었고(굳이 분수로 변환하고 있을 필요가 없으며, 단지 수열식을 구하기만 하면 되기 때문에) BigInt 클래스에서도 + operator 만 제대로 구현하면 될 일이었다.
한참의 삽질로 나온 코드는 애초에 만들 필요가 없었다. 그나마 위안이 될 만한 것은 큰 수 클래스와 분수 클래스를 좀더 보강했다는 것일까.
오일러 57번의 풀이 코드는 여기 에서 확인할 수 있고, BigInt.cpp, BigInt.h, main.cpp 만 사용한다. 실행시간은 0.077 초.