본문 바로가기

Programming/Project Euler118

[C/C++] 프로젝트 오일러 #60 소수쌍 집합 이번 문제는 처음으로 난이도 20%짜리 문제입니다. 소수쌍이라고 해서 특별한 수학적인 내용이 들어가 있는 것은 아닙니다.3, 7 이 두개의 소수가 있다고 하면, 이 두개의 소수를 단순하게 이어서 37, 73을 만들었을 때, 이 수들도 소수가 되면, (3, 7)은 소수쌍이 되는 것입니다. 이러한 소수들은 무한히 존재하겠지만, 빈도가 많지는 않습니다. 이 문제를 풀기 위해서는 메모리를 사용해서 해당되는 셋들을 만들것인가가 중요했습니다. 그렇게 하려면, 너무 자료구조가 복잡해서, 약간의 꼼수를 사용했습니다. 일단, 소수들을 결합하기 위한 재료는 미리 저장을 해놓고, 소수들을 결합한 결과에 대한 소수 검사는 별도의 라이브러리를 이용했습니다. 그리고 min이라는 정적 변수를 두어서, 이 값을 이용해서 현재 .. 2016. 6. 17.
[C/C++] 프로젝트 오일러 #59 : XOR 암호 풀기 이번 문제는 난이도가 5%이기는 하지만, 실제로 정석대로 푼다면 5%보다 높을 것 같네요. 암호를 푸는 방법은 무식한 방법으로 반복대치를 하는 경우가 많습니다. 단순 반복대치를 하면 풀 수는 있겠지만, 보통 수만대의 컴퓨터를 동원해도 몇천년, 몇만년 이상 걸리는 경우가 허다합니다. 양자컴퓨터가 나온다면 좀 달라질 수 있겠지만요. 이 문제에서는 주어진 텍스트에 3글자 소문자로 이루어진 키를 가지고 암호를 푸는 것입니다. 원래 문제 의도(난이도 5%)였다면, 3글자 소문자 키를 생성하고, 그것에 의해서 영어의 일반 언어가 도출되는지를 검사하면 되겠죠. 예를 들어서 a, this, is, are, you, 등등이 될겁니다. 전 고전적인 방법, 즉, 암호키를 알기 힘들다는 가정하에서 풀어보았습니다. .. 2016. 6. 16.
[C++] 프로젝트 오일러 #58 : 나선형 소수들 #58 문제도 난이도는 5% 문제입니다. 문제 자체는 복잡해 보여도 사실 푸는데 전혀 어려움이 없는 문제예요. 문제는 1부터 차례대로 나선형으로 수들을 배치하게 되면, 대각선쪽에는 홀수가 항상 배치되게 됩니다. 그럴 경우, 대각선에 있는 홀수 중 소수의 비율이 얼마일것인가가 이 문제를 푸는데 중요한 부분입니다. 이 문제는 소수의 비율이 10% 미만으로 떨어질 때, 한 변에 위치하는 수들의 갯수를 답하라는 것입니다. 배치하는 방법이 일정하기 때문에, 대각선에 위치한 숫자들의 순열만 파악하면 됩니다. 일단 첫번째 대각선(가장 작은 수)의 수열은 다음과 같이 표현할 수 있습니다. s를 한변 길이의 절반이라고 할 때(즉, 1이 위치한 s는 0, 그 다음은 1, 그 다음은 2.. ), \[ f_s = 4s^.. 2016. 6. 15.
[C++/Python] 프로젝트 오일러 #57 : 제곱근의 수렴 이번 문제는 수학 문제인 듯 보이지만, 그냥 단순 계산 문제입니다.프로젝트 오일러 사이트 난이도 평가 5% 문제네요. 문제의 내용은 2의 제곱근을 구할 때, 연분수 전개를 할 수가 있습니다. 연분수 전개에 관련해서는 펠의 방정식(http://sdev.tistory.com/213) 글을 참조하세요. \[ \sqrt{2} = 1 + \cfrac{1}{2 + \cfrac{1}{2 + \cfrac{1}{2 + \cdots}}} = [1; \overline{2}] \] 와 같이 2의 제곱근을 표시할 수 있습니다. 이 문제에서는 이것이 중요한 것이 아니고, 이 연분수 전개를 할 때, 분수로 표현하게 되면, 분모와 분자가 모두 정수가 되는데, 분자의 정수부가 분보의 정수부보다 자릿수가 많은 것이 몇개가 있는 가가.. 2016. 6. 14.
[C++/Python] 프로젝트 오일러 #56 : 제곱수의 자릿수 합 이 문제는 난이도 5% 문제이지만, BigInt 모듈이 없는 언어 사용자는 해당 모듈을 구해야 하는 어려움이 있습니다. 파이썬, 자바, C#과 같이 BigInt 모듈이 있는 프로그래밍 언어 등을 이용하면 간단하게 해결할 수 있습니다. 문제는 간단합니다.a, b 좀 더 좋은 알고리즘을 찾는다는 것은 어려울 것 같습니다. 그냥 무식한 방법으로 풀어보았습니다.프로그램의 관건은 C/C++에서는 Big Integer 라이브러리를 사용하거나, 간단한 형태로 Big Integer를 구현하면 됩니다.제 경우에는 직접 만들어 보았습니다. 아래는 제가 만든 소스입니다.//------------------------------------------------// Project Euler #56 - Powerf.. 2016. 6. 13.
[C++/Python] 프로젝트 오일러 #55 라이크렐 수 이번 문제도 난이도 5% 문제입니다. 라이크렐 수는 어떤 양의 정수가 있다면, 그 정수를 10진수로 표현했을 때, 역순으로 표시된 수와의 합이 대칭수가 되는 가입니다. 대칭수가 되지 않으면, 마찬가지로 역순의 수와 더합니다. 이론상으로는 점점 증가하는 수이므로, 언젠가 확률적으로 대칭수(역순으로 표시해도 자기 자신이 되는 수)가 될 수 있습니다. 증명은 되지 않았지만, 무한히 시행해도 대칭수가 만들어지지 않는 수가 있다고 하고, 그 수들을 라이크렐 수라고 부릅니다. 그리고 그런 수중에 가장 작은 수가 196이라고 알려져 왔습니다. 문제는 얼마나 많이 시행을 하는 가에 따라서, 라이크렐 수라고 생각한 수가 라이크렐 수가 아닐 수도 있습니다. 그래서 이 문제에서는 시행횟수가 50번까지 안 되면 라이크.. 2016. 6. 10.
728x90