[코테] 백준 시물레이션과 구현 16931번 문제
16931번 : 겉넓이 구하기
문제 링크
https://www.acmicpc.net/problem/16931
문제 설명
크기가 N×M인 종이가 있고, 종이는 1×1크기의 칸으로 나누어져 있다. 이 종이의 각 칸 위에 1×1×1 크기의 정육면체를 놓아 3차원 도형을 만들었다.
종이의 각 칸에 놓인 정육면체의 개수가 주어졌을 때, 이 도형의 겉넓이를 구하는 프로그램을 작성하시오.
위의 그림은 3×3 크기의 종이 위에 정육면체를 놓은 것이고, 겉넓이는 60이다.
입력
첫째 줄에 종이의 크기 N, M이 주어진다. 둘째 줄부터 N개의 줄에는 종이의 각 칸에 놓인 정육면체의 수가 주어진다.
출력
첫째 줄에 도형의 겉넓이를 출력한다.
제한
- 1 ≤ N, M ≤ 100
- 1 ≤ 종이의 한 칸에 놓인 정육면체의 수 ≤ 100
문제풀이
상하좌우, 위아래 총 6개 방향에 대하여 보이는 겉넓이를 각각 합산하여 구하면 된다.
- 위, 아래의 경우 겉넓이가 각각 N * M 이다.
- 상하좌우는 현재 칸의 높이가 이전칸의 높이보다 높을 때 그 차이를 더하면 된다.
N, M = map(int, input().split())
arr = []
for i in range(N) :
arr.append(list(map(int, input().split())))
# 위, 아래에서의 겉넓이는 각각 N*M이므로 합한 값 저장
result = N * M * 2
# 좌측에서 본 겉넓이 더하기
for i in range(N) :
result += arr[i][0]
for j in range(1, M) :
if arr[i][j] > arr[i][j-1] :
result += arr[i][j] - arr[i][j-1]
# 우측에서 본 겉넓이 더하기
for i in range(N) :
result += arr[i][M-1]
for j in range(M-2, -1, -1):
if arr[i][j] > arr[i][j+1] :
result += arr[i][j] - arr[i][j+1]
# 상측에서 본 겉넓이 더하기
for i in range(M) :
result += arr[0][i]
for j in range(1, N) :
if arr[j][i] > arr[j-1][i] :
result += arr[j][i] - arr[j-1][i]
# 하측에서 본 겉넓이 더하기
for i in range(M) :
result += arr[N-1][i]
for j in range(N-2, -1, -1):
if arr[j][i] > arr[j+1][i] :
result += arr[j][i] - arr[j+1][i]
print(result)
Comments