[SWEA][D3][#02805] 농작물 수확하기
작성:    
업데이트:
카테고리: SWEA D3
태그: ProblemSolving, SWEA D3, SWEA PS
출처
학습용 포스트입니다. 본 포스트가 문제가 될 시 수정 또는 삭제하겠습니다.
문제
N X N크기의 농장이 있다.
이 농장에는 이상한 규칙이 있다.
규칙은 다음과 같다.
① 농장은 크기는 항상 홀수이다. (1 X 1, 3 X 3 … 49 X 49)
② 수확은 항상 농장의 크기에 딱 맞는 정사각형 마름모 형태로만 가능하다.
사진 생략
1 X 1크기의 농장에서 자라는 농작물을 수확하여 얻을 수 있는 수익은 3이다.
3 X 3크기의 농장에서 자라는 농작물을 수확하여 얻을 수 있는 수익은 16 (3 + 2 + 5 + 4 + 2)이다.
5 X 5크기의 농장에서 자라는 농작물의 수확하여 얻을 수 있는 수익은 25 (3 + 2 + 1 + 1 + 2 + 5 + 1 + 1 + 3 + 3 + 2 + 1)이다.
농장의 크기 N와 농작물의 가치가 주어질 때, 규칙에 따라 얻을 수 있는 수익은 얼마인지 구하여라.
제약 사항
농장의 크기 N은 1 이상 49 이하의 홀수이다. (1 ≤ N ≤ 49)
농작물의 가치는 0~5이다.
입력
가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.
각 테스트 케이스에는 농장의 크기 N과 농장 내 농작물의 가치가 주어진다.
출력
각 줄은 ‘#t’로 시작하고, 공백으로 농장의 규칙에 따라 얻을 수 있는 수익을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
예제
입력
1
5
14054
44250
02032
51204
52212
출력
#1 23
My Sol
T = int(input())
for tc in range(1, T+1):
N = int(input())
m = N//2
mat = [list(map(int, input())) for _ in range(N)]
ret = 0
for i in range(m):
for j in range(m-i, m+i+1):
ret += mat[i][j]
mat2 = []
while mat:
mat2.append(mat.pop())
for i in range(m+1):
for j in range(m-i, m+i+1):
ret += mat2[i][j]
print(f'#{tc} {ret}')
농장의 크기가 N일 때, 항상 (0, N//2)은 채워지는 것에서 착안하였다. 행 역시 홀수이므로 N//2를 의미하는 m까지 각 행에 대하여 m-i부터 m+i까지 열을 결정해서 mat[i][j]의 2차원 배열 좌표를 설정하면 되겠다. 그 이유는 행이 늘어날수록, 기준점인 m으로부터 한 행이면 -1, +1, 두 행이면 -2, +2 이므로, i행이면 -i, i 만큼 좌우로 퍼져나갈 것이기 때문이다.
그런데 마름모꼴이므로 다시 (N-1, m)을 향해 수렴해야하는데, 이를 위해 중앙선 위쪽까지만 각 칸의 값을 총계 변수에 더해주고, 농장의 행을 아예 거꾸로하는 2차원 배열 mat2를 따로 만들어 다시 위와 같은 과정을 거쳤다. 이때 중앙선도 조회하며 값을 더해야하므로 for i in range(m+1)
로 범위를 중앙선 범위까지 설정해주었다.
결과
PASS
댓글남기기