[백준/c++] 16931번: 겉넓이 구하기

somyeong·2022년 3월 29일
0

코테 스터디

목록 보기
4/52

문제 링크 - 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 ) 높이를 입력받았다.
    • (현재 인덱스의 높이)-(인접한 인덱스의 높이)를 구했을때 음수이면 드러나지 않으므로 겉넓이에 포함되지 않는다. 그래서 차가 양수일 때만 더해야 한다.

🌱 코드

//16931번: 겉넓이 구하기
#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; //위아랫면 합 : 2*n*m

    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            cin>>arr[i][j];
        }
    }
    // 4개의 옆면 합 구하기
    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

profile
공부한 내용 잊어버리지 않게 기록하는 공간!

0개의 댓글