겉넓이 구하기

문제

언어

  • JavaScript

순서도

  1. 위쪽 면, 아래 쪽 면 구하기
  2. 왼쪽 면, 가운데 면, 오른쪽 면 구하기
  3. 앞쪽 면, 가운데 면, 뒤쪽 면 구하기

문제 풀이 step 1

  • 중학교 수학 문제와 유사한 문제로 그 시절의 수학적인 개념이 기억난다면 수월하게 풀 수 있는 문제인 것 같습니다.
  • 간단하게 생각해볼 부분은
    • 위쪽 면 : 위에서 내려다볼 때 보이는 면 모두
    • 아래쪽 면 : 아래에서 올려다볼 때 보이는 면 모두
    • 앞쪽 면 : 앞에서 볼 때 가장 가까운 면 모두
    • 뒤쪽 면 : 뒤에서 볼 때 가장 가까운 면 모두
    • 왼쪽 면 : 왼쪽에서 볼 때 가장 가까운 면 모두
    • 오른쪽 면 : 오른쪽에서 볼 때 가장 가까운 면 모두
  • 이렇게 총 6 가지 입니다.

문제 풀이 step 2

  • 추가적으로 가운데 면을 세어주면 됩니다.
  • 가운데 면에는
    • 앞쪽 면과 뒤쪽 면 사이에 있는 가운데 면들
    • 왼쪽 면과 오른쪽 면 사이에 있는 가운데 면들
  • 이렇게 총 2 가지가 있습니다.

문제 풀이 step 3

  • 가운데 면을 제외한 부분은 그냥 세면 되기 때문에 넘어가고, 가운데 면만 설명하겠습니다. 백준 16931번 겉넓이 구하기 옆면 사진
    • 가운데 면은 사진 상에서 파란색 화살표로 가리킨 면들을 얘기합니다.
    • 그렇다면, 가운데 면은 어떻게 구해야할까요??
  • 가운데 면을 기준으로 양옆의 기둥의 높이 차이가 바로 가운데 면의 개수가 됩니다.
    • 그림을 배열 형태로 바꾸면
      [
        [4, 3, 4],
        [3, 2, 2],
        [1, 2, 1],
      ];
      
    • 이런 모습일 것입니다.
  • 그렇다면 왼쪽 면과 오른쪽 면 사이에 있는 가운데 면들 중에서 첫 번째 가운데 면의 개수는
    • Math.abs(4 - 3) + Math.abs(3 - 2) + Math.abs(1 - 2) 로 총 3 개입니다.
  • 그리고 왼쪽 면과 오른쪽 면 사이에 있는 가운데 면들 중에서 두 번째 가운데 면의 개수는
    • Math.abs(3 - 4) + Math.abs(2 - 2) + Math.abs(2 - 1) 로 총 2 개 입니다.
  • 따라서 왼쪽 면과 오른쪽 면 사이에 있는 가운데 면들의 총 개수는 5 개 입니다.

문제 풀이 step 4

  • 위의 경우에 따라서 모든 면의 개수를 다 구해서 합하고 출력하면 정답이 됩니다.

소스 코드

const input = require("fs")
	.readFileSync("/dev/stdin")
	.toString()
	.trim()
	.split("\n");

const solution = (input) => {
	const [n, m] = input[0].split(" ").map(Number);
	const arr = input.slice(1).map((v) => v.split(" ").map(Number));
	let cnt = 0;

	// 위쪽 면, 아래쪽 면 구하기
	cnt += n * m * 2;

	// 왼쪽 면, 가운데 면, 오른쪽 면 구하기
	// 왼쪽 면, 오른쪽 면
	for (let i = 0; i < n; i++) {
		cnt += arr[i][0] + arr[i][m - 1];
	}
	// 가운데 면
	for (let j = 1; j < m; j++) {
		for (let i = 0; i < n; i++) {
			cnt += Math.abs(arr[i][j - 1] - arr[i][j]);
		}
	}

	// 앞쪽 면, 가운데 면, 뒤쪽 면 구하기
	// 앞쪽 면, 뒤쪽 면
	for (let j = 0; j < m; j++) {
		cnt += arr[0][j] + arr[n - 1][j];
	}
	// 가운데 면
	for (let i = 1; i < n; i++) {
		for (let j = 0; j < m; j++) {
			cnt += Math.abs(arr[i - 1][j] - arr[i][j]);
		}
	}

	return cnt;
};

console.log(solution(input));