[백준] 16931 겉넓이 구하기 JavaScript

·2024년 7월 5일

문제

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

종이의 각 칸에 놓인 정육면체의 개수가 주어졌을 때, 이 도형의 겉넓이를 구하는 프로그램을 작성하시오.

위의 그림은 3×3 크기의 종이 위에 정육면체를 놓은 것이고, 겉넓이는 60이다.

입력

첫째 줄에 종이의 크기 N, M이 주어진다. 둘째 줄부터 N개의 줄에는 종이의 각 칸에 놓인 정육면체의 수가 주어진다.

1 ≤ N, M ≤ 100
1 ≤ 종이의 한 칸에 놓인 정육면체의 수 ≤ 100

출력

첫째 줄에 도형의 겉넓이를 출력한다.

예제 입력

3 3
1 3 4
2 2 3
1 2 4

예제 출력

60

내가 했던 풀이 방법

겉넓이를 구하기 위해 up/down/left/right/front/back에서 바라본 넓이를 구해야 한다.
up/down은 항상 N×M이 된다. left와 right / front와 back은 같으므로, 한 방향씩만 계산하여 ×2를 해줄 수 있다.

Left와 Right: 각 행에서 인접한 큐브들의 높이 차이를 더해준다.
Front와 Back: 각 열에서 인접한 큐브들의 높이 차이를 더해준다.

이들을 계산한 값들을 모두 더해주면 된다.

코드

const fs = require('fs');
let [n, ...element] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');

let N = Number(n.trim().split(' ')[0]);
let M = Number(n.trim().split(' ')[1]);

let top = N * M;
let bottom = N * M;
let left = 0;
let front = 0;

for (let i = 0; i < element.length; i++) {
  element[i] = element[i].trim().split(' ').map(Number);
}

for (let i = 0; i < N; i++) {
  left += element[i][0];
  for (let j = 1; j < M; j++) {
    if (element[i][j] > element[i][j - 1]) {
      left += element[i][j] - element[i][j - 1];
    }
  }
}

for (let j = 0; j < M; j++) {
  front += element[0][j];
  for (let i = 1; i < N; i++) {
    if (element[i][j] > element[i - 1][j]) {
      front += element[i][j] - element[i - 1][j];
    }
  }
}

console.log(top + bottom + 2 * left + 2 * front);

회고

간단하게 각 행과 각 열에서의 max값을 구하면 될거라고 생각했다. 하지만, 예시와 같은 경우 다른 정육면체에 의해 특정 방향에서 바라볼 때 가려지는 것으로 보이지만 드러나있는 부분이 존재하게 된다. 이를 어떻게 구해주어야 하는가에 대한 고민을 한참했는데 결과적으로는 각 행과 열에서 인접한 정육면체와의 높이 차를 이용하면 단순하게 해결되었다... 이런 단순한 생각을 빨리빨리 할 수 있게 되면 좋겠다..

profile
Frontend🍓

0개의 댓글