일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Convolutional Neural Network
- CNN
- 오일러 프로젝트
- 자전거 여행
- A Neural Algorithm of Artistic Style
- 수달
- Autoencoder
- 역전파
- SQL
- 냥코 센세
- deep learning
- 전처리
- backpropagation
- 소인수분해
- mnist
- 합성곱 신경망
- 역전파법
- project euler
- c#
- 히토요시
- 딥러닝
- 신경망
- neural network
- 베이지안
- bayesian
- Python
- 오토인코더
- 소수
- Gram matrix
- 비샤몬당
- Today
- Total
목록IT/PROJECT_EULER (60)
통계, IT, AI
1. 개요 문제는 이곳에서 확인할 수 있다. 7254는 39와 186의 곱으로 나타낼 수 있다. 즉 \(39 \times 186=7254\)이다. 이 수식에는 1부터 9까지의 숫자가 한번씩만 사용되었다. 7254와 같이, 1부터 9까지의 숫자를 한번씩만 사용하여 곱의 형태로 나타낼 수 있는 모든 숫자의 합을 구하는 것이 목표이다. 2. 구현 문제의 조건에 맞는 곱의 형태는 두가지 밖에 없다. 즉, 한자리 숫자와 네자리 숫자를 곱하여 네자리 숫자를 만드는 것과 두자리 숫자와 세자리 숫자를 곱하여 네자리 숫자를 만드는 경우 이외에는 문제의 조건에 맞지 않는다. 이를 이용하여 답을 구하자. # -*- coding: utf-8 -*- answer = [] # CASE 1: 1-digit multiply 4-di..
1. 개요문제는 이곳에서 확인할 수 있다. 1, 2, 5, 10, 20, 50, 100 그리고 200을 사용하여 200을 만드는 방법의 수를 구하는 것이 목표이다. 이 문제는 재귀함수를 사용하여 간단하게 해결할 수 있다. 즉, 200에서 100을 빼고 나면, 문제는 100을 만드는 방법의 수를 구하는 것으로 변한다. 2. 구현: ver 1.0재귀함수를 이용하여 구현한다. 하지만 이 방법은 그다지 효율적이진 않은데, 만약 200이 아니라 400을 구하라고 해도 생각보다 시간이 오래 걸린다. 사람들의 아이디어를 참고하여 memoization을 사용하려고 했지만 아둔하기 짝이 없어 결국 이해하지 못했다. # -*- coding: utf-8 -*- import numpy as np coins = [200, 10..
1. 개요문제는 이곳에서 확인할 수 있다. \(1634\)는 각 자리수의 4승의 합과 같다. 즉, \(1634=1^4+6^4+3^4+4^4\)이다. 이와 같이, 각 자리수의 5승의 합과 같은 모든 숫자의 합을 구하는 것이 목표이다. 단, 1은 합이 아니므로 제외한다.2. 구현: ver 1.0무한히 많은 숫자에 대해서 이를 테스트할 수는 없으므로 상한선을 찾아야 한다. \(n\)자리의 수 \(d\)가 있다고 하자. \(d\)의 최소값은 \(10^{n-1}\)이며, 최대값은 \(10^n-1\)이다. 그리고 \(d\)의 각 자리수의 5승의 합의 최대값은 \(9^5n\)이다. 따라서 \(10^{n-1}>9^5n\)를 만족하는 \(n\)부터는 확인할 필요가 없다. 사실 \(9^5\times 7=59049 \tim..
1. 개요 문제는 이곳에서 확인할 수 있다. 정수 \(a\in[2,100], b\in[2,100]\)에 대하여 \(a^b\)의 개수를 세는 것이 목표이다. 단, 중복은 제외한다. 2. 구현: ver 1.0loop를 이용하여 구현하되 overflow를 방지하기 위하여 Decimal 내장 모듈을 사용한다. # -*- coding: utf-8 -*- import decimal as d term_list = [] for a in range(2, 101): for b in range(2,101): term_list.append(d.Decimal(a) ** d.Decimal(b)) print(len(set(term_list))) 답은 9183이다.
1. 개요문제는 이곳에서 확인할 수 있다. 1부터 시계 방향으로 늘어놓은 뒤 대각선에 있는 숫자들의 합을 구할 수 있다. 아래의 예는 5행 5열의 숫자더미이며 대각선의 숫자의 합은 101이다. 1001행 1001열의 숫자더미에서 대각선의 숫자의 합을 구하는 것이 목표이다. 2. 구현: ver 1.0일반항을 구하여 문제를 해결하자. 1부터 시작하여 오른쪽에 존재하는 숫자들의 개수를 층이라고 정의하자. 예를 들면, 그림 1은 3층이다. 그러면 오른쪽 대각선의 있는 숫자는 층수 번째 홀수의 제곱임을 알 수 있고 이를 이용하여 일반항을 구할 수 있다. # -*- coding: utf-8 -*- n = 500 print(n*(8*(n+1)*(2*n+1)//3+2*n+6)+1) 답음 669171001이다.
1. 개요문제는 이곳에서 확인할 수 있다. 어떤 정수 \(a\), \(b\)가 주어졌을 때, Quadratic form \(n^2+an+b\)는 \(n=0\)부터 시작하여 소수를 연속적으로 생성한다. 예를 들어 \(n^2+n+41\)은 40개의 소수를, \(n^2-79n+1601\)은 80개의 소수를 생성한다. 소수를 연속적으로 가장 많이 생성하는 \(a\)와 \(b\)를 찾고 그 곱을 구하는 것이 목표이다. 단, \(a\), \(b\)를 \(\left| a\right| lim: break self.prime_list.extend(prime_candidate_list) def quadratic_formula(n, a, b): """소수를 생성하는 식""" return n**2 + a*n + b p = P..
1. 개요문제는 이곳에서 확인할 수 있다. 1보다 크고 1000보다 작은 어떤 자연수 \(d\)로 순환소수 \(1/d\)를 만들 수 있다. 예를 들어 \(1/6=0.1(6)\)이며 \(1/7=0.(142857)\)이다. 순환되는 부분이 가장 긴 \(d\)를 찾는 것이 목표이다. 2. 구현: ver 1.0나눗셈을 수행하면서 순환되는 부분이 어디에서 발생하는지 확인한다. # -*- coding: utf-8 -*- def count_reciprocal_cycles(d): """나눗셈을 수행하면서 나머지가 0이면 순환되는 부분이 없으므로 0을 반환한다. 나머지가 이미 발생한 나머지라면 순환이 시작되는 부분이므로 이 부분을 찾는다.""" quotient_list, remainder_list = [], [] n =..
1. 개요문제는 이곳에서 확인할 수 있다. \(n\)번째 피보나치 수열의 값을 \(F_n\)이라고 할 때 최초로 1000의 자리를 넘는 \(F_n\)의 \(n\)을 구하는 것이 목표이다. 단, \(F_1=F_2=1\)이다. 2. 구현: ver 1.0처음에는 피보나치 수열의 일반항을 구하여 진행하려고 했으나 일반항에 무리수가 포함되어 있고 거듭제곱 연산이 발생하기 때문에 계산상 오차가 발생하였다. 피보나치 수열의 일반항은 3. 피보나치 수열의 일반항에 적고, 본 문제의 해결은 피보나치 수열의 정의를 이용한다. # -*- coding: utf-8 -*- import math as m fn_2, fn_1 = 1, 1 fn = fn_2 + fn_1 n = 3 while m.log(fn, 10) < 999: # ..
1. 개요 문제는 이곳에서 확인할 수 있다. 숫자 0, 1 그리고 2가 주어졌다고 하자. 이 숫자들로 만들 수 있는 순열을 크기 순으로 나열하면 012, 021, 102, 120, 201 그리고 210이다. 이때 이 순열의 3번째 값은 102이다. 이와 같은 방식으로 0부터 9까지의 숫자가 주어졌을 때 100만번째 값을 구하는 것이 목표이다. 2. 구현: ver 1.0 0, 1, 2가 주어지고 5번째 값을 구한다고 하자. 가장 앞에 오는 수는 2이다. 왜냐하면 0과 1이 가장 앞에 올때 순열의 가짓수는 각각 2이기 때문이다. 이후 남은 5-2-2=1번째 순열을 구하면 되므로 남은 0과 1이 선택된다. 이와 같은 방식을 구현한다. # -*- coding: utf-8 -*- import math as m d..
1. 개요 문제는 이곳에서 확인할 수 있다. 어떤 자연수 \(n\)이 있을 때, \(n\)을 제외하고 \(n\)을 나누어 떨어지게 하는 수들을 proper divisors라고 하자. proper divisors의 합이 \(n\)과 같을 때 \(n\)을 perfect number라고 한다. 그리고 proper divisors의 합이 \(n\)보다 작을 때 \(n\)을 deficient number, 클 때 abundant number라고 한다. 예를 들면, 28의 proper divisors는 1, 2, 4, 7, 14이며 그 합은 28이므로 28은 perfect number이다. 12의 proper divisors는 1, 2, 3, 4, 6이며 그 합은 16이므로 가장 작은 abundant number이..