문제 링크 - https://www.acmicpc.net/problem/16931
🌱 문제
🌱 풀이
- 그림을 보면 총 6면으로 나눌 수 있는데 그중에 위아래면과 옆면(4개)를 따로 구해서 합을 구했다.
- 위 아랫면 구하기 : 문제에서 1<=종이 한칸에 놓인 정육면체 수<=100 이므로 위,아랫면의 겉넓이는 n*m 을 만족한다.
- 옆면 구하기 : 옆면 4개의 합은, 2차원 배열의 각 위치에서의 높이와 사방(위,아래,오른쪽,왼쪽) 위치의 높이의 차이만큼이 겉넓이에 포함된다.
- 즉, 인접한(사방) 위치의 높이와 비교했을때 차이가 겉보기에 튀어나온 부분의 넓이이다.
- 비교할때 arr[n][m]의 사방에 높이가 0인 인덱스가 있다고 생각해주어야 모든 겉넓이를 고려 할 수있다.
- 그래서 1<=N,M<=100이므로 사방에 한칸씩 있는것을 고려하여 arr[102][102]로 선언하였고, 안쪽에( 1<=x<=N, 1<=y<=M ) 높이를 입력받았다.
- (현재 인덱스의 높이)-(인접한 인덱스의 높이)를 구했을때 음수이면 드러나지 않으므로 겉넓이에 포함되지 않는다. 그래서 차가 양수일 때만 더해야 한다.
🌱 코드
#include <iostream>
using namespace std;
int n,m;
int arr[102][102];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int sum=0;
cin>>n>>m;
sum=2*n*m;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
cin>>arr[i][j];
}
}
for(int x=1; x<=n; x++){
for(int y=1; y<=m; y++){
for(int i=0; i<4; i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(arr[x][y]>arr[nx][ny])
sum+=(arr[x][y]-arr[nx][ny]);
}
}
}
cout<<sum<<"\n";
}
참고 사이트
https://velog.io/@embeddedjune/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%80-%EC%8B%9C%EB%AE%AC%EB%A0%88%EC%9D%B4%EC%85%98-16931-%EA%B2%89%EB%84%93%EC%9D%B4-%EA%B5%AC%ED%95%98%EA%B8%B0