본문 바로가기

코딩테스트/SWEA

[Python, 파이썬] SWEA 2805. 농작물 수확하기

 

 

 

1. N X N크기의 농장이 있다.(N은 모두 홀수)

2. 이 농장은 오직 마름모 영역의 농작물만 수확할 수 있다.

 

N이 주어졌을 때, 수확할 수 있는 농작물의 합계를 구하는 문제다.

 

 

T = int(input()) # 테스트 케이스의 개수

for test_case in range(1, T+1):

    N = int(input()) # 농장의 크기 N
    farm = [] # 농작물

    for _ in range(N):
        farm.append([int(i) for i in input().strip()]) # 숫자로 바꿔서 배열에 저장

    half = N//2 # 마름모 중간
    money = 0 # 농작물 합

    for i in range(N):

        diff = half - i # 반복 변수

        if (diff > 0):
            money += sum(farm[i][diff:-diff]) # 마름모 윗부분 삼각형

        elif (diff < 0):
            money += sum(farm[i][-diff:diff]) # 마름모 아래 역삼각형

        else:
            money += sum(farm[i]) # 마름모 중간

    print('#%d %d' %(test_case, money))
 
 

 

[문제풀이]


간단히 말하면 마름모 영역 안의 값을 구하는 문제!

마름모는 대칭이고, 파이썬에선 음수 인덱스란 기능이 있다.

half 즉 중간값에서 현재 i를 빼면 2, 1, 0, -1, -2로 시작 위치가 정해진다.

 

farm[i][diff:-diff] # 마름모 윗부분 삼각형
 

그리고 diff부터 -diff 하면 diff부터 리스트 끝에서 diff 요소까지 뽑을 수 있다.

n = [1, 2, 3, 4, 5]

예) n[1:-1] -> n[1]는 2, n[-2]는 -5
리스트 슬라이싱은 매번 끝 인덱스-1번째까지 뽑으므로 [2, 3, 4]가 뽑힌다.
 

 

이때, half-i가 음수가 되면 역으로 되서 뽑을 수 없으므로 diff, -diff 위치를 바꿔주고. 마름모 중간의 경우 0번부터 -0번 인덱스는 모두 다 뽑혀 나오는게 아니라 아무것도 뽑혀 나오지 않게 되므로 따로 뽑아준다.