일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- datetime
- 네이밍
- timestamp
- Codeforces
- project euler
- python
- 리스트 컴프리헨션
- 소수
- 딕셔너리
- 파이썬
- SUM
- lower_case_table_names
- 자료구조
- SUM()
- 외래키
- flask
- ceil
- 큰 수 나누기
- 2557
- BOJ
- 에라토스테네스의 체
- list comprehension
- FOREIGN KEY
- floor
- 세그먼트 트리
- mysql
- itertools
- Dictionary
- enumerate
- convention
Archives
- Today
- Total
늒네 기록
[PE] Project Euler 32 본문
[python] string을 list()하면 어떻게 될까? 글에서 이어서,
문제 링크는 프로젝트 오일러 32번.
39 × 186 = 7254 같이, 곱하는 두 수와 곱한 결과에 1부터 9까지 숫자가 다 들어가는 경우를 찾으면 되는데, 이게 뜻하는 것은 결국 str(i) + str(j) + str(i*j)의 결과에 1부터 9까지 숫자가 모두 포함되어 있다는 것과 같다.
그런데 위에서 string을 list로 바꾸는 것이 쉽게 가능함을 보았으니, 이를 바로 활용하면
sorted(list(str(i)+str(j)+str(i*j))) == list('123456789')
이 조건이 true인 경우를 찾는 문제로 바뀐다. i, j중 작은 숫자가 100 이상일 경우, 3자리수 * 3자리수가 최소 5자리수이므로, 총 숫자 개수가 11개 이상이 되어버려 조건을 만족할 수 없다는 것까지 관찰했다면, 이 문제는 아래와 같이 접근할 수 있다.
s = []
for i in range(1,100):
for j in range(i, 123456789):
if len(str(i)+str(j)+str(i*j))>9: break
if sorted(list(str(i)+str(j)+str(i*j))) == list('123456789'):
print(i,j,i*j)
if i*j in s: continue
s.append(i*j)
print(s)
print(sum(s))
j 범위가 커보이지만, 어차피 j가 다섯자리 이상 수가 되면 1자리수 * 5자리수 = 5자리수 이상이 되어 break문에 걸려 다음 i로 넘어간다. 즉, 루프를 최대 10^2 * 10^4 = 10^6회 밖에 돌지 않는 것. 이렇게 하면 무리 없이 답을 구할 수 있다.
반응형
'알골 공부 기록 > Project Euler' 카테고리의 다른 글
[PE] Project Euler 93 (0) | 2020.10.03 |
---|---|
[PE] Project Euler 97 (0) | 2020.09.27 |
[PE] Project Euler 21 (0) | 2020.09.26 |
[PE] Project Euler 13 (0) | 2020.09.22 |
[PE] Project Euler 7 (0) | 2020.09.22 |
Comments