늒네 기록

[PE] Project Euler 13 본문

알골 공부 기록/Project Euler

[PE] Project Euler 13

jaeha lee 2020. 9. 22. 01:57

프로젝트 오일러 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
Comments