16931번 - 겉넓이 구하기

의혁·2025년 1월 6일
0

[Algorithm] 알고리즘

목록 보기
11/50

💡 수학적인 접근법을 길러야 할 거 같다..🥲
겉넓이를 구할 경우, 왼쪽과 오른쪽 / 앞쪽과 뒤쪽 / 위쪽과 아래쪽 모두 "대칭"이다.

N, M = map(int, input().split(' '))

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

left = 0        
# 오른쪽 , 왼쪽 (둘다 동일)
for i in range(N):
    for j in range(M):
        
        if j == 0:
            left += array[i][j]
        else:
            if array[i][j-1] < array[i][j]:
                left += array[i][j] - array[i][j-1]
# 오른쪽, 왼쪽 둘다 계산
left *= 2

front = 0
# 앞쪽, 뒷쪽 (둘다 동일)
for k in range(M):
    for l in range(N):
        
        if l == 0:
            front += array[l][k]
        else:
            if array[l-1][k] < array[l][k]:
                front += array[l][k] - array[l-1][k]
# 앞쪽, 뒷쪽 둘다 계산
front *= 2

print(left + front + 2*N*M)
  • 처음 문제를 봤을때는 너무 쉽게 접근해서, 위쪽과 아래쪽은 항상 N*M개 이니까 놔두고, 앞쪽, 뒷쪽, 왼쪽, 오른쪽에서 봤을때 보이는 모양의 겉넓이를 구하면 될것이라고 생각했다.
  • 하지만 60이 나와야 할 답이 자꾸만 58이 나왔다...

  • 생각해보니 최댓값으로 구하면 색칠되어 있는 부분이 계산되어지지 않았고, 이 조건에서의 갯수를 추가로 세어야했다.
left = 0        
# 오른쪽 , 왼쪽 (둘다 동일)
for i in range(N):
    for j in range(M):
        
        if j == 0:
            left += array[i][j]
        else:
            if array[i][j-1] < array[i][j]:
                left += array[i][j] - array[i][j-1]
# 오른쪽, 왼쪽 둘다 계산
left *= 2
  • 1) 왼쪽과 오른쪽의 경우로 예를 들면, 가장 겉에 있는 면들은 전부 더해준다
  • 2) 옆에 있는 블록이 나보다 작다면 작은 수 만큼의 겉넣이를 더해준다.

이런식으로 접근하니 답이 잘 나올 수 있었고, 다른 부분도 적용해서 정답을 맞췄다.👍🏻

profile
매일매일 차근차근 나아가보는 개발일기

0개의 댓글