Problem Solving/BOJ(백준)

[BOJ]백준 16931번: 겉넓이 구하기

이진2 2021. 2. 5. 00:47

www.acmicpc.net/problem/16931

 

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;
}