오답노트

[시뮬레이션] BOJ 16931번 겉넓이 구하기 본문

C,C++/코딩테스트

[시뮬레이션] BOJ 16931번 겉넓이 구하기

권멋져 2022. 5. 26. 15:45
https://www.acmicpc.net/problem/16931
 

16931번: 겉넓이 구하기

크기가 N×M인 종이가 있고, 종이는 1×1크기의 칸으로 나누어져 있다. 이 종이의 각 칸 위에 1×1×1 크기의 정육면체를 놓아 3차원 도형을 만들었다. 종이의 각 칸에 놓인 정육면체의 개수가 주어

www.acmicpc.net

- 문제 파악

NxM 의 배열이 주어지고 각 배열에는 10 미만의 자연수와 0이 주어진다. 각 숫자는 정육면체가 쌓인 개수를 의미하는데 이때 겉넓이를 출력하라

 

- 정답

#include "bits/stdc++.h"

using namespace std;

int arr[102][102];
unsigned long long ans;

int main()
{
	int n, m;
	cin >> n >> m;

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> arr[i][j];
		}
	}

	int dx[] = { 0,0,1,-1 };
	int dy[] = { 1,-1,0,0 };


	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			int ntmp = 2; // 위 아래에서 볼때

			for (int k = 0; k < 4; k++)
			{
				int nx = j + dx[k];
				int ny = i + dy[k];

				bool bCheck = false;

				if (nx < 0 || nx >= m)
				{
					ntmp += arr[i][j];
					bCheck = true;
				}

				if (ny < 0 || ny >= n)
				{
					ntmp += arr[i][j];
					bCheck = true;
				}

				if (arr[i][j] > arr[ny][nx] && !bCheck)
					ntmp += (arr[i][j] - arr[ny][nx]);


			}

			ans += ntmp;

		}
	}

	cout << ans;

}