Problem Solving/Project Euler

[프로젝트 오일러] Problem 11 Solution

happykoa 2020. 4. 6. 22:34

오랜만에, 프로젝트 오일러 문제 풀이입니다.

이미 문제들은 풀려있으나, 정리하는게 귀찮아서 맨날 미루네여..

프로젝트 오일러라는 사이트는 적당한 수학? 아이디어? 생각? 들을 배울 수 있는 사이트입니다.

http://euler.synap.co.kr/

 

Project Euler

About Project Euler @ kr 레온하르트 오일러 (1707-1783) 환영합니다! 프로젝트 오일러 (ProjectEuler.net) 는 수학적인 문제들을 컴퓨터 프로그래밍으로 하나씩 해결해가는 퀴즈 풀이 사이트입니다. 여기에는 흥미로운 내용이 많이 있지만, 문제나 댓글 등이 모두 영어로 되어 있어서 다소 부담스러울 수 있습니다. 우리 사이트 (Project Euler @ kr) 에서는 보다 많은 이들이 쉽게 접근해서 즐길 수 있도록 원본 문

euler.synap.co.kr

사이트에 대한 자세한 내용은 위 링크로 들어가셔서 한번 보시면 될 것 같습니다.

 

문제 내용

11번 문제는 주어지는 20 x 20 행렬에서 가로, 세로 대각선 방향으로 연속되는 네 개의 자연수의 곱 중 최댓값을 구하는 문제입니다.

 

풀이

따로 길게 설명할 이유가 없는 문제인 것 같습니다.

사이즈가 20 x 20 이기 때문에 그냥, 탐색을 잘 하면 되는 문제입니다.

 

제 코드에서는 파일 입출력으로 20x20 행렬을 입력받았지만, 그냥 input()으로 한 다음에 사이트에 있는 숫자들을 copy & paste 해도 됩니다. :)

 

import sys
f = open(sys.path[0] + "\\11.txt","r")
L = [list(map(int,f.readline().split())) for i in range(20)]
f.close()

ans = 0
# 수평
for i in range(20):
    for j in range(17):
        k = L[i][j] * L[i][j+1] * L[i][j+2] * L[i][j+3]
        ans = max(ans,k)
# 수직
for j in range(20):
    for i in range(17):
        k = L[i][j] * L[i+1][j] * L[i+2][j] * L[i+3][j]
        ans = max(ans,k)

# 대각선 1 \ 방향
for i in range(17):
    for j in range(17):
        k = L[i][j] * L[i+1][j+1] * L[i+2][j+2] * L[i+3][j+3]
        ans = max(ans,k)

# 대각선 2 / 방향
for i in range(17):
    for j in range(3,20):
        k = L[i][j] * L[i+1][j-1] * L[i+2][j-2] * L[i+3][j-3]
        ans = max(ans,k)

print(ans)

 

답은 스스로 한번 코드를 작성하고 실행해보시길 바랍니다 :)

Rmx