일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 외래키
- mysql
- 에라토스테네스의 체
- python
- flask
- lower_case_table_names
- FOREIGN KEY
- SUM()
- 세그먼트 트리
- 자료구조
- 소수
- itertools
- BOJ
- 큰 수 나누기
- convention
- floor
- Codeforces
- list comprehension
- 파이썬
- Dictionary
- project euler
- timestamp
- datetime
- ceil
- enumerate
- 2557
- 네이밍
- SUM
- 리스트 컴프리헨션
- 딕셔너리
- Today
- Total
늒네 기록
[PE] Project Euler 13 본문
프로젝트 오일러 13번 문제는 파이썬으로 푼다고 하면 거저 먹는 문제다. 큰 수 연산 문제는, 특히 난이도가 낮은 문제라면 파이썬에서 특별히 신경 써야 하는 부분이 적어진다.
문제에서는 100개의 50자리수가 주어지고, 이를 다 더한 다음 앞의 10자리 수를 구하라고 한다. 이런 유형의 문제를 쉽게 푸는 환경을 세팅하는 것에 이 포스트의 의의를 두겠다.
가장 간단한 방법은, 먼저 코드 자체에 100개의 숫자로 이루어진 리스트를 두고 합을 구하는 것이다. 코드는 다음과 같다.
l = [
37107287533902102798797998220837590246510135740250,
...
53503534226472524250874054075591789781264330331690
]
print(sum(l))
이 다음, python 코드를 실행하면 된다. 문제는, 이러한 방식으로 접근하면 여러 종류의 인풋을 가지고 테스트해기 쉽지 않다는 것이다. 더해야 하는 숫자들이 한 파일 내에 전부 모아져있고, 이 파일을 인풋으로 받아서 처리하는 파이썬 코드를 짜는 편이 더 확장성 있다고 볼 수 있다.
이를 위해서 다음과 같은 파일을 준비하자.
# input.ex
37107287533902102798797998220837590246510135740250
46376937677490009712648124896970078050417018260538
...
53503534226472524250874054075591789781264330331690
예시에서는 파일 이름을 input.ex라고 했는데, 파일명과 확장자는 문제를 일으키지 않을 정도로 무난하게 마음대로 작성해도 되는것 같다. 숫자들은 각 라인당 하나씩 존재하는 식. 그리고 다음과 같은 코드를 작성한다.
# solution.py
x = 0
while True:
try:
s = int(input())
x+=s
except Exception as e:
print(x)
break
이 코드에서는 input()함수를 이용해서 한 줄씩 인풋 파일을 읽은 다음 x에 더하는데, 만일 읽기를 실패하면(즉, 마지막 줄을 넘어가면) exception에 걸리고, x값을 출력하고 while문을 벗어난다. 러프한 코드긴 하지만 해당 문제를 푸는 데에는 빠르게 쓰기 좋은 방식.
두 파일을 같은 폴더에 두고, 커맨드라인에 python solution.py < input.ex 하는 식으로 input.ex 파일을 파이썬 파일에 먹여주면 원하는 결과를 얻을 수 있다.
보통의 문제들에서는 인풋 숫자의 개수를 인풋 파일에 같이 정해준다. 예를 들어, input.ex파일 맨 위에 앞으로 주어질 숫자 개수 100을 남겨두는 식.
# input.ex
100
37107287533902102798797998220837590246510135740250
46376937677490009712648124896970078050417018260538
...
53503534226472524250874054075591789781264330331690
이런 경우, 다음과 같이 코드를 짜면 대응이 편하다.
# solution.py
x = 0
for _ in range(int(input()): # 첫 줄 인풋의 숫자를 써서 그대로 for문을 돌린다.
x+=int(input()) # 그리고, 한 줄씩 더한다.
print(x)
이 경우 마지막 줄을 넘어서서 input()함수를 부를 일이 없으므로, 예외처리를 할 필요가 없어지며, 코드가 훨씬 짧아진다. 이 경우에도 똑같이 python solution.py < input.ex 를 커맨드라인에 입력하는 식으로 테스트가 가능하다.
'알골 공부 기록 > 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 7 (0) | 2020.09.22 |
[PE] Project Euler 32 (0) | 2020.09.12 |