본문 바로가기
반응형

프로젝트 오일러69

프로젝트 오일러 #55 라이크렐 수 이번 문제도 난이도 5% 문제입니다. 라이크렐 수는 어떤 양의 정수가 있다면, 그 정수를 10진수로 표현했을 때, 역순으로 표시된 수와의 합이 대칭수가 되는 가입니다. 대칭수가 되지 않으면, 마찬가지로 역순의 수와 더합니다. 이론상으로는 점점 증가하는 수이므로, 언젠가 확률적으로 대칭수(역순으로 표시해도 자기 자신이 되는 수)가 될 수 있습니다. 증명은 되지 않았지만, 무한히 시행해도 대칭수가 만들어지지 않는 수가 있다고 하고, 그 수들을 라이크렐 수라고 부릅니다. 그리고 그런 수중에 가장 작은 수가 196이라고 알려져 왔습니다. 문제는 얼마나 많이 시행을 하는 가에 따라서, 라이크렐 수라고 생각한 수가 라이크렐 수가 아닐 수도 있습니다. 그래서 이 문제에서는 시행횟수가 50번까지 안 되면 라이크렐 수라.. 2016. 6. 10.
54. 프로젝트 오일러 #54 : 포커 승리 판정 이번 문제는 어렵다는 생각은 들지 않았지만, 상당히 귀찮은 문제이긴 합니다.프로젝트 오일러 사이트에서의 난이도는 10% 문제입니다. 고포류 게임을 만들어본 적은 없지만, 포커의 룰에 따라서 누가 이겼는지를 판정하는 것은 포커 게임에서 가장 중요한 부분입니다. 그 외의 것이야 인터페이스이니까요. 이번 문제는 상당히 깁니다.최종적인 이야기는 결국 주어진 카드를 보고서 첫번째 사용자가 몇번 이겼는 가를 판정하는 것입니다. 사실, 이런 판정시스템을 만드는 것이 단순히 노가다만은 아닙니다. 얼마나 더 효율적으로 판단할 수 있게 하는 것이 프로그램을 작성하는 사람에게는 고민이겠죠. 고포류 게임에서 노가다로 프로그램 짠다고 해서, 효율적 프로그램에 비해서 훨씬 더 느리다던지 하는 것은 아닙니다. 프로그램 코드 사이즈.. 2016. 6. 10.
53. 프로젝트 오일러 #53 : 조합 선택 이번 문제는 간단한 문제입니다. 조합 공식만 알면 쉽게 문제를 풀 수 있습니다. n이 1부터 100까지 변할 때, 조합 숫자 을 계산할 때, 1백만이 넘는 결과가 나오는 갯수를 적으면 됩니다. 단순무식한 방법으로 하더라도, 총 10,100 번 조합 계산을 하면 됩니다. 이라는 사실을 알고 있다면, 그 절반으로 줄테고요. 대칭형인데, 단순증가 단순감소 패턴이라는 것을 아신다면, 더 횟수를 줄일 수 있습니다. 단, 조합을 계산하는 곱하기 횟수가 증가하니, 실제 곱하기 횟수로 따진다면, 정도의 복잡도를 가집니다. n이 100정도이니, 시간이 아주 조금 더 걸리는 것 뿐이지, 계산 못 할 정도는 절대 아닙니다. 저는, 조금 특이한 방법으로 문제를 풀어봤습니다. 바로 파스칼의 삼각형을 이용하는 것인데요. 위의 그.. 2016. 6. 9.
52. 프로젝트 오일러 #52 : 순열 곱 52번 문제는 너무나도 유명한 문제여서, 문제를 보고서 프로그램 작성을 하지 않고도 답을 낼 수 있었습니다. 이 문제는 순환소수 중, 소수에 의한 문제입니다. 문제 자체는 어렵지 않으니까, 어떻게든 풀면 됩니다. 난이도 5% 문제입니다. 51번 문제가 난이도 15%로 잠깐 높아졌었지만요. 프로젝트 오일러 사이트의 문제는 다음과 같습니다. 125874와 같은 숫자는 2배를 하면 251748로 숫자의 위치만 바뀌어서 나타납니다. x, 2x, 3x, 4x, 5x, 6x 가 모두 같은 숫자들을 가지고 있는 가장 작은 숫자를 찾으세요. 이 문제를 단순무식법으로 풀려면, 자릿수의 숫자만 계산해서 같은 숫자가 나오는지 검사하면 됩니다. 그렇지만, 그렇게 하면 시간이 많이 걸립니다. 사실 요즘 컴퓨터에서는 이렇게 하여.. 2016. 6. 9.
51. 프로젝트 오일러 #51 : 소수 자릿수 대치 프로젝트 오일러 #51 문제는 처음으로 난이도 5%가 아닌 문제입니다. 다른 문제들에 비해서 난이도가 좀 있습니다. 주어진 문제는 56xx3 과 같은 x로 비어진 숫자가 있는데, 이 x에 0~9까지 숫자를 넣었을 때, 소수는 몇개가 나오는 가입니다. 56003, 56113, 56223, 56333, 56443, 56553, 56663, 56773, 56883, 56993 이라는 10개의 숫자들을 만들 수가 있는데요. 이 중 소수는 7개나 됩니다. 이 때, 56003(이 그룹 중 가장 작은 수)는 소수가 7개가 되는 최소의 수입니다. 찾아야 하는 수는 소수가 8개가 되는 최소의 수입니다. 문제를 적용하는 방법을 구상하는 것이 어렵지, 문제 자체는 짧은 시간에 컴퓨터가 계산해냈습니다. 저는 기본적으로 자기호.. 2016. 6. 8.
50. 프로젝트 오일러 #50 : 이어지는 소수들의 합 이번 문제는 난이도 자체는 그리 어렵지 않습니다. 프로젝트 오일러 사이트에서 주어진 난이도는 5%입니다. 저에게 있어서 이 문제 자체가 어렵다는 생각은 하지 않았습니다. 하지만 속도를 빠르게 하려다보니 많은 생각을 해야만 했습니다. 문제는 주어진 범위안의 연속된 소수의 합이 또다른 소수가 될 때, 주어진 범위안의 소수 갯수가 최대가 되는 소수를 찾는 것입니다. 처음에 도전한 방법은 단순무식한 방법이었습니다. 단순무식한 방법이라고 하지만, 나름대로 속도를 빨리 나오게 하려고 노력하였습니다. 아래 소스는 단순무식한 방법으로 짰을 때입니다. #define LIMIT 1000000 void solve1() { static unsigned primes[LIMIT/2]; unsigned pcount = 0; pri.. 2016. 6. 5.
728x90