본문 바로가기

알고리즘 설계/내가 보려고 정리하는 문풀

사과나무(다이아몬드)

사과농장은 N*N 격자판 이루어짐 (N의 크기는 항상 홀수)

각 격자안에는 한 그루의 사과나무

격자판안의 사과를 수확할 때 다이아몬드 모양의 격자판만 수확

수확하는 사과의 총 개수를 출력하는 프로그램 작성

 

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

N=5

수확하는 사과의 총 개수를 출력하는 프로그램 작성

첫 줄에 N 입력 받고 두번째 줄 부터 격자판 입력받음

 

입력예시)

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


내가 쓴 코드

import sys
sys.stdin = open("input.txt", 'rt')

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

apples = 0

#행 인덱스를 가리키는 포인터 rp와 열 인덱스를 가리키는 포인터 cp
rp = 0
cp = N//2

#i랑 rp랑 실질적으로는 같지만 포인터를 옮기는 느낌을 위해 따로 사용
#수확하는 칸이 늘어나는 부분 먼저 위에서 아래로 내려가며 수확
for i in range(N//2+1):
    cp = N//2 - i
    for _ in range(i*2+1):
        apples += grid[rp][cp]
        cp += 1
    rp += 1

#수확하는 칸이 줄어드는 부분은 밑에서부터 위로 올라오며 수확
rp = N-1
cp = N//2
for i in range(N//2):
    cp = N//2 - i
    for _ in range(i*2 + 1):
        apples += grid[rp][cp]
        cp += 1
    rp -= 1

print(apples)

 

모범답안

import sys
sys.stdin = open("input.txt", 'rt')

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

res = 0
start = end = n//2

for i in range(n):
    for j in range(start,end+1):
        res += a[i][j]
    if i < n//2:
        start -= 1
        end += 1
    else:
        start += 1
        end -= 1

print(res)

 

모범답안 보고 느낀점

1. 우와. 짱쉬운 문젠데 엄청 복잡하고 오래 풀었다..

포인터냐 포인터는!!!.. 아니지 인덱스를 가리키는 포인터를 생각한건 아주 잘함

특히 이건 지난 풀이들에서 느낀점이었찌 아주 잘했다 근데 행과 열을 가리키는걸 두개 만들게 아니라

행 별로 수확의 시작과 끝을 가리키는 포인터를 만들었어야했당.

2. 한계인가 생각을 못했지

3. 느낀점이라곤 좌절밖에.. 연습을 계속 일단 해보자 늘겠지? 알고리즘 연습은

이제 시작이니까~~ 아쟈아쟈홧팅


다시 써보기

import sys
sys.stdin = open("input.txt",'rt')

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

apples = 0
s = e = N//2
for i in range(N):
    for j in range(s,e+1):
        apples += grid[i][j]
    if i < N//2:
        s -= 1
        e += 1
    else:
        s += 1
        e -= 1

print(apples)

'알고리즘 설계 > 내가 보려고 정리하는 문풀' 카테고리의 다른 글

봉우리  (0) 2024.10.20
곶감(모래시계)  (2) 2024.10.19
격자판 최대합  (3) 2024.10.16
수들의 합  (3) 2024.10.16
두 리스트 합치기  (4) 2024.10.01