PS

백준 16931번 겉넓이 구하기

남마허 2020. 3. 21. 04:49

https://www.acmicpc.net/problem/16931

 

16931번: 겉넓이 구하기

크기가 N×M인 종이가 있고, 종이는 1×1크기의 칸으로 나누어져 있다. 이 종이의 각 칸 위에 1×1×1 크기의 정육면체를 놓아 3차원 도형을 만들었다. 종이의 각 칸에 놓인 정육면체의 개수가 주어졌을 때, 이 도형의 겉넓이를 구하는 프로그램을 작성하시오. 위의 그림은 3×3 크기의 종이 위에 정육면체를 놓은 것이고, 겉넓이는 60이다.

www.acmicpc.net

 

 

 

 

 

<접근방법>

각 블록기둥의 겉넓이를 구해 모두 더해서 답을 구합니다.

블록기둥의 위아래는 무조건 각각 1 입니다.

블록기둥의 상, 하, 좌, 우는 붙어있는 블록기둥과의 높이차 입니다.

 

블록기둥을 입력받을 때 한 칸씩 띄워서 받아서 구현편의성을 높였습니다.

 

<느낀 점>

 

 

 


 

 

 

<코드>

#include <iostream>
#include <algorithm>
using namespace std;

int n, m, map[105][105], row_max[100], col_max[100];
int dy[4] = { 1, -1, 0, 0 };
int dx[4] = { 0, 0, 1, -1 };

int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> map[i][j];
		}
	}

	int res = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			for (int d = 0; d < 4; d++) {
				int ty = i + dy[d];
				int tx = j + dx[d];

				int gap = map[i][j] - map[ty][tx];
				if (gap > 0) {
					res += gap;
				}
			}
		}
	}

	res += 2 * n * m;

	cout << res << '\n';

	return 0;
}

 

 

 

 

 

 

 

반응형