[알고리즘] 사과나무(다이아몬드)

(문제) 사과나무(다이아몬드)


현수의 농장은 N * N 격자판으로 이루어져 있으며, 각 격자안에는 한 그루의 사과나무가 심어저있다.

N의 크기는 항상 홀수이다.

가을이 되어 사과를 수확해야 하는데 현수는 격자판안의 사과를 수확할 때 다이아몬드 모양의 격자판만 수확하고 나머지 격자안의 사과는 새들을 위해서 남겨놓는다.

만약 N이 5이면 아래 그림과 같이 진한 부분의 사과를 수확한다.



현수과 수확하는 사과의 총 개수를 출력하세요.

입력설명

첫 줄에 자연수 N(홀수)이 주어진다.(3<=N<=20)

두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다.

이 자연수는 각 격자안에 있는 사과나무에 열린 사과의 개수이다.

각 격자안의 사과의 개수는 100을 넘지 않는다.

출력설명

수확한 사과의 총 개수를 출력합니다.

테스트케이스

입력예제 출력예제
5
10 13 10 12 15
12 39 30 23 11
11 25 50 53 15
19 27 29 37 27
19 13 30 13 19
379
7
74 10 31 26 59 16 89
78 44 49 1 64 33 15
9 95 70 18 22 25 40
62 77 28 3 78 75 23
82 38 20 16 42 1 79
1 24 2 25 95 26 79
4 35 46 94 70 44 83
1049

해결방법

n 반절 위치의 index를 구해 mid 변수에 대입한다.

처음 행의 반절 까지는 규칙적으로 mid - i ~ mid + i + 1 위치 까지 점차 증가 시킨다.

반절이 지나고서는 다시 원 상태로 복귀를 해야하고 i 가 mid를 넘겨서 복귀를 하기 위해서 range 규칙을 바꾼다.

i - mid 로 시작을 해서 n-(i-mid) 까지 반복하도록 한다.


코드

n = int(input())

arr = [list(map(int, input().split())) for _ in range(n)]

mid = n // 2

_sum = 0

for i in range(n):

    if i <= mid:
        for j in range(mid-i, mid+i+1):
            _sum = _sum + arr[i][j]
    else:
        for j in range(i-mid, n-(i-mid)):
            _sum = _sum + arr[i][j]

print(_sum)

댓글남기기