일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- itertools
- 세그먼트 트리
- 딕셔너리
- convention
- 에라토스테네스의 체
- list comprehension
- Codeforces
- flask
- datetime
- floor
- mysql
- 자료구조
- 리스트 컴프리헨션
- 파이썬
- 2557
- python
- SUM()
- enumerate
- 네이밍
- 외래키
- lower_case_table_names
- project euler
- BOJ
- timestamp
- ceil
- SUM
- FOREIGN KEY
- 큰 수 나누기
- Dictionary
- 소수
Archives
- Today
- Total
늒네 기록
[PE] Project Euler 27 본문
프로젝트 오일러 27번에 처음 접근하면서 이거 나이브하게 풀어도 풀릴까 테스트 먼저 해보자고 생각하고 달려들었는데 바로 풀려버려서... 문제는 n^2 + a*n + b 꼴의 함수가 주어졌을때, 절댓값 1000 이하의 두 정수 a, b를 선택하여 n=0부터 i 이하의 숫자들을 대입했을 때 전부 소수가 되도록 하는 최대 i의 값이 최대가 되도록 하는 것이다. 즉, (a, b) 쌍에 대해 i가 결정되는데, 이 i값을 최대로 만드는 (a, b)쌍을 구하는 것.
나이브한 방법으로 풀 때에는 다음의 아이디어만 있어도 충분하다.
- 어떤 수가 소수인지 판별하기 위해서는 2부터 그 수의 제곱근 이하의 모든 자연수에 대하여 나눠보면 된다.
- 조금 탐색 공간을 줄이고 싶다면, n=0을 대입했을 때 값이 b가 되므로, b가 소수여야 한다.
문제를 풀 때는 두 번째 아이디어를 적용하기 귀찮아서 b가 음수일 경우 n=0일때 소수가 되지 않을테니 b가 음이 아닌 정수라는 조건 정도만 걸어두었다.
그리고 p_test 함수에서는 n이 2보다 작으면 소수가 아니므로 바로 false값을 리턴하게 하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
def p_test(n):
if n<2: return False
for i in range(2,int(n**0.5)+1):
if n%i==0: return False
return True
sol = -1
sol_x = (-1,-1)
for a in range(-1000, 1001):
for b in range(0, 1001):
x = 0
while 1:
if p_test(x*x+a*x+b):
x+=1
else:
break
if x>sol:
sol=x
sol_x=(a,b)
print(sol_x)
a,b = sol_x
print(a*b)
|
cs |
이 정도 만으로 계산 시간 그리 오래 걸리지 않고(10초 미만..?) 원하는 답을 얻을 수 있다.
반응형
'알골 공부 기록 > Project Euler' 카테고리의 다른 글
[PE] Project Euler 41 (0) | 2020.10.04 |
---|---|
[PE] Project Euler 37 (0) | 2020.10.04 |
[PE] Project Euler 72 (0) | 2020.10.03 |
[PE] Project Euler 57 (0) | 2020.10.03 |
[PE] Project Euler 55 (0) | 2020.10.03 |
Comments