Stay Hungry Stay Foolish

SWEA

[SWEA] 2805. 농작물 수확하기 (Python/D3)

dev스카이 2024. 10. 24. 12:13

[문제 링크] 👇

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


 

풀이

sol.1

  • 중심 계산
    • 농장의 중심은 로 구한다. 예를 들어, 일 때 중심은 2번째 행이다.
  • 각 행에서 수확 범위 계산
    • 각 행마다 수확 범위의 시작점은 중심에서 얼마나 떨어져 있는지에 따라 결정된다. 즉, 로 구할 수 있다.
    • 끝점은 로 계산하여 그 범위까지 수확할 수 있다.
  • 수익 계산
    • 수확 가능한 범위의 농작물들을 sum 함수를 이용해 더한 후, 그 값을 누적하여 최종 수익을 계산한다.

 

 

sol.2

  • start와 end로 수확할 수 있는 열의 범위를 나타낸다.
  • 처음에는 중심열 하나만 수확한다. 즉, start = end = n // 2로 설정된다.
  • 윗부분에서는 각 행마다 start는 줄어들고, end는 커진다. 즉, 위에서 내려올수록 수확 범위가 넓어진다는 것이다.
  • 중심 이후로는 start는 증가하고, end는 줄어든다. 즉, 아래로 내려갈수록 수확 범위가 좁아진다.
  • 각 행에서 수확 범위(start에서 end까지)의 농작물 값을 더하여 result에 누적한다.

 

 

 

Solution

sol.1

def harvest_profit(n, farm):
    center = n // 2 #농장의 중심
    result = 0
    for i in range(n):
        #행 i에서 수확 가능한 범위
        start = abs(center - i)  # 시작점 (중심에서 떨어진 거리만큼 시작점 이동)
        end = n - start  # 끝점
        result += sum(farm[i][start:end])  # 해당 행의 수확 범위의 값들을 더함
    return result

test_case = int(input())
for tc in range(1, test_case + 1):
    n = int(input()) #농장 크기
    farm = [list(map(int, input())) for _ in range(n)] 
    result = harvest_profit(n, farm)
    print("#%d %d" %(tc, result))

 

sol.2

test_case = int(input())
for tc in range(1, test_case + 1):
    n = int(input()) #농장 크기
    farm = [list(map(int, input())) for _ in range(n)] 
    result = 0
    start, end = n // 2, n // 2

    for i in range(n):
        for j in range(start, end + 1):
            result += farm[i][j]
        if i < n // 2: #중간 행 기준으로 위쪽 계산
            start -= 1
            end += 1
        else: #중간 행 기준으로 아래쪽 계산
            start += 1
            end -= 1
    print("#%d %d" %(tc, result))

 

 

 

👩‍💻 회고

어떻게 풀어야할지 막막했던 문제다. 풀이를 보면 간단해 보이지만 풀 방법이 잘 떠오르진 않는다. 다시 풀어봐야 할 문제이다.