Problem Solving/BOJ(백준)
[BOJ]백준 16931번: 겉넓이 구하기
이진2
2021. 2. 5. 00:47
16931번: 겉넓이 구하기
크기가 N×M인 종이가 있고, 종이는 1×1크기의 칸으로 나누어져 있다. 이 종이의 각 칸 위에 1×1×1 크기의 정육면체를 놓아 3차원 도형을 만들었다. 종이의 각 칸에 놓인 정육면체의 개수가 주어
www.acmicpc.net
백준의 겉넓이 구하기 문제 기하적인 문제이다
각 칸의 넓이를 1이라 했을 때, 도형의 겉넓이를 구하는 문제이다
이 때, 그림의 흰색 칸은 위에서 투시했을 때의 위쪽 면의 겉넓이이다.
밑에서 봤을 때에도 동일하므로 초기의 겉넓이 값은 N*M*2이다
그리고 옅은 주황색 면을 보면, 요철이 많지만 앞에서 투시해서 봤을 때 반대편에서 봤을 때랑 겉넓이가 같음을 알 수 있다.
따라서 옅은 주황색 면의 겉넓이를 구해준 뒤, *2 해준다.
짙은 주황색 면도 마찬가지로, 오른쪽에서 봤을 때랑 왼쪽에서 봤을 때 겉넓이가 같으므로 *2 해준다.
#include <cstdio>
int main() {
int n, m,arr[105][105],ans;
scanf("%d%d", &n, &m);
ans=n*m;
for (int i = 1; i <= n; i++) {
int sum = 0;
for (int j = 1; j <= m; j++) {
scanf("%d", &arr[i][j]);
if (arr[i][j] > arr[i][j - 1])sum += arr[i][j] - arr[i][j - 1];
}
ans += sum;
}
for (int j = 1; j <= m; j++) {
int sum = 0;
for (int i = 1; i <= n; i++)
if (arr[i][j] > arr[i-1][j])sum += arr[i][j] - arr[i-1][j];
ans += sum;
}
printf("%d", ans*2);
return 0;
}